Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程错误:已存在与此连接关联的打开的DataReader,必须先关闭该DataReader_C#_Mysql_Multithreading - Fatal编程技术网

C# 多线程错误:已存在与此连接关联的打开的DataReader,必须先关闭该DataReader

C# 多线程错误:已存在与此连接关联的打开的DataReader,必须先关闭该DataReader,c#,mysql,multithreading,C#,Mysql,Multithreading,我有一个平行的Foreach循环 var options = new ParallelOptions(); options.MaxDegreeOfParallelism = 1; Parallel.ForEach(urlTable.AsEnumerable(),drow => { using (var WCC = new MasterCrawlerClass()) { WCC.MasterCrawlBegin(drow); } } 这个循环调用该

我有一个平行的Foreach循环

var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 1;
Parallel.ForEach(urlTable.AsEnumerable(),drow =>
{
    using (var WCC = new MasterCrawlerClass())
    {
        WCC.MasterCrawlBegin(drow);
    }
 }
这个循环调用该类并在所有my DataRows中循环,但是这些DataRows中的每一个要么执行DataTable填充,要么执行MySQL数据库的更新命令。下面是我的代码

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;
}
问题是WCC包含10个左右的空洞,每个空洞至少访问MySQL函数一次。因此,如果答案是锁定,是否可以为所有空隙创建一个锁定功能?如果是,怎么做?如果有别的办法,请告诉我

谢谢

好的,正如我建议的,我把问题综合起来

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

静态只读对象_object=new object()

公共静态数据表DTTable(字符串mysqlQuery,字符串queryName) { 锁定(_对象) { DataTable DTTableTable=新DataTable(); 尝试 { 使用(MySqlDataAdapter DataDTTables=newmysqldataadapter(mysqlQuery、MySQLProcessing.MySQLStatic.Connection)) { 使用(DataTable datadttabledt=newdatatable()) { DataDTTables.SelectCommand.CommandTimeout=240000; DataDTTables.Fill(DataDTTablesDT); DTTableTable=DataDTTablesDT; DataDTTables.Dispose(); } } } 捕获(例外情况除外) { GenericLogging(“失败的MySQLquery:+ex.Message.ToString(),“MySQLProcessor”,“DTTable”,“MysqlError”,“queryName,MySQLquery”); } 返回DTTable表; } }
这是调用DataReader的唯一代码,如果有锁,怎么可能有两个打开的数据读取器?

问题是ADO.NET数据提供程序通常不允许每个连接一次有多个打开的数据读取器。SQLServer有这个概念,但据我所知,MySQL还不支持它


您可能需要指定不同的连接,而不是
MySQLProcessing.MySQLStatic.connection
。没有什么可以阻止您使用多个连接。这里的问题是连接是昂贵的资源,所以你应该节约使用它们

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


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

如果我没有弄错的话,问题在于返回DataTable的方法,而不是返回void的方法。你可以实现一个连接池来解决这个问题。你是对的,但是我在空白处设置了一个锁,所以它怎么可能在锁定时调用它呢上面粘贴的代码中没有锁。但是,您确定这是您使用此连接的唯一方法吗?另外,你可以创建几个连接。这是一种低成本的连接,因为.NET有一个连接池,如果一个连接已经可用,就不会创建新的连接。Fabske好吧,你会认为你可以在没有5个votesI的情况下关闭你自己的问题。我不明白。所有这些都可以通过不使用静态连接来避免。不,不是。你使用它,处理它,你就完蛋了<代码>使用(var conn=CreateSomeConnection()){/*使用它。*/}
。这是一个连接。
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);
    }
}
public static DataTable DTTable(string mysqlQuery, string queryName) { lock (_object) { DataTable DTTableTable = new DataTable(); try { using (MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection)) { using (DataTable DataDTTablesDT = new DataTable()) { DataDTTables.SelectCommand.CommandTimeout = 240000; DataDTTables.Fill(DataDTTablesDT); DTTableTable = DataDTTablesDT; DataDTTables.Dispose(); } } } catch (Exception ex) { GenericLogging("Failed MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery); } return DTTableTable; } }