MultiThreading错误:已经有一个与此Connection关联的打开DataReader,必须先关闭它

我有一个Parallel.Foreach循环

var options = new ParallelOptions(); options.MaxDegreeOfParallelism = 1; Parallel.ForEach(urlTable.AsEnumerable(),drow => { using (var WCC = new MasterCrawlerClass()) { WCC.MasterCrawlBegin(drow); } } 

这个循环调用类并循环遍历我的所有DataRows,但是每个数据行都执行DataTable填充,或者对MySQL DB执行更新命令。 我对这两个代码的代码如下。

 private static DataTable DTTable(string mysqlQuery, string queryName) { DataTable DTTableTable = new DataTable(); try { MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection); DataTable DataDTTablesDT = new DataTable(); DataDTTables.SelectCommand.CommandTimeout = 240000; DataDTTables.Fill(DataDTTablesDT); DTTableTable = DataDTTablesDT; } catch (Exception ex) { GenericLogging("Failed MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery); } return DTTableTable; } 
 private static void MySQLInsertUpdate(string MySQLCommand, string mysqlcommand_name) { try { MySqlCommand MySQLCommandFunc = new MySqlCommand(MySQLCommand, MySQLProcessing.MySQLStatic.Connection); MySQLCommandFunc.CommandTimeout = 240000; MySQLCommandFunc.ExecuteNonQuery(); } catch (Exception ex) { GenericLogging("Failed MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", mysqlcommand_name, MySQLCommand); } } 

事情是WCC包含10个左右的空洞,这些空洞中的每一个都至少访问一次MySQL函数。 因此,如果锁定是答案,是否可以为所有空隙创建1个锁定function? 如果是这样的话? 如果有其他方式,请告诉我

谢谢!

好的,我建议我巩固问题

代码现已更新以反映锁定,请参阅下文。

static readonly object _object = new object();

  public static DataTable DTTable(string mysqlQuery,string queryName)
         {
            锁定(_object)
             {
                 DataTable DTTableTable = new DataTable();
                尝试
                 {
                    使用(MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery,MySQLProcessing.MySQLStatic.Connection))
                     {
                        使用(DataTable DataDTTablesDT = new DataTable())
                         {
                             DataDTTables.SelectCommand.CommandTimeout = 240000;
                             DataDTTables.Fill(DataDTTablesDT);
                             DTTableTable = DataDTTablesDT;
                             DataDTTables.Dispose();
                         }
                     }

                 }
                 catch(Exception ex)
                 {

                     GenericLogging(“失败的MySQLquery:”+ ex.Message.ToString(),“MySQLProcessor”,“DTTable”,“”,“MysqlError”,“”,queryName,mysqlQuery);

                 }
                返回DTTableTable;
             }
         } 

这是唯一调用DataReader的代码,如果有锁,怎么会有两个开放的数据读取器呢?

问题是ADO.NET数据提供者通常不允许每个连接一次使用多个开放数据读取器。 SQL Server具有多个活动结果集(MARS)的概念,但据我所知,MySQL还不支持它。

您可能需要指定除MySQLProcessing.MySQLStatic.Connection之外的其他连接。 没有什么可以阻止您使用多个连接。 这里的问题是连接是昂贵的资源,所以你应该谨慎使用它们。

您正在同时使用相同的连接。

你有几个线程吗? 因为似乎2个线程使用相同的连接来同时进行调用。