我有一个 Parallel.Foreach 循环
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 1;
Parallel.ForEach(urlTable.AsEnumerable(),drow =>
{
using (var WCC = new MasterCrawlerClass())
{
WCC.MasterCrawlBegin(drow);
}
}
这个循环调用类并循环遍历我所有的数据行,但是这些数据行中的每一个要么填充数据表,要么对 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;
}
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 个锁定功能?如果是这样怎么办?如果有其他方法,请告诉我
谢谢!
好的,按照建议我合并了问题
代码现已更新以反射(reflect)锁定,请参见下文。
静态只读对象 _object = new object();
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; } }
只有这一段代码调用了DataReader,有锁怎么会有两个打开的data reader?
最佳答案
问题是 ADO.NET 数据提供程序通常不允许每个连接同时打开一个以上的数据读取器。 SQL Server 有 multiple active result sets (MARS) 的概念, 但据我所知 MySQL 还不支持它。
您可能需要指定一个不同于 MySQLProcessing.MySQLStatic.Connection
的连接。没有什么能阻止您使用多个连接。这里的问题是连接是昂贵的资源,因此您应该谨慎使用它们。
关于c# - 多线程错误 : There is already an open DataReader associated with this Connection which must be closed first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10081042/