我有一个 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 个锁定功能?如果有怎么办?如果有其他方法,请告诉我
谢谢!
好的,按照建议,我合并了问题
代码现已更新以反映锁定,请参见下文。
static readonly object _object = new object();
公共静态数据表DTTable(字符串mysqlQuery,字符串queryName) { 锁定(_object) { 数据表 DTTableTable = new DataTable(); 尝试 { 使用 (MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection)) { 使用 (DataTable DataDTTablesDT = new DataTable()) { DataDTTables.SelectCommand.CommandTimeout = 240000; DataDTTables.Fill(DataDTTablesDT); DTTableTable = 数据DTTablesDT; 数据DTTables.Dispose(); } } } 捕捉(例外前) { GenericLogging("MySQLquery 失败:" + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery); } 返回 DTTableTable; } }
这是唯一调用DataReader的代码,如果有锁怎么会有两个打开的数据读取器?