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 個程度のボイドが含まれており、これらのボイドのそれぞれが少なくとも 1 回は MySQL 関数にアクセスすることです。それで、ロックが答えなら、すべてのボイドに対して 1 つのロック機能を作成することは可能ですか? もしそうなら、どのように?他に方法があれば教えてください
ありがとう!
提案どおり、質問を統合しました
ロックを反映するようにコードが更新されました。以下を参照してください。
static readonly object _object = new object();
public static DataTable DTTable(string mysqlQuery, string queryName) { ロック (_object) { DataTable DTTableTable = new DataTable(); 試す { using (MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection)) { 使用 (DataTable DataDTTablesDT = new DataTable()) { DataDTTables.SelectCommand.CommandTimeout = 240000; DataDTTables.Fill(DataDTTablesDT); DTTableTable = DataDTTablesDT; DataDTTables.Dispose(); } } } キャッチ(例外例) { GenericLogging("失敗した MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery); } DTTableTable を返します。 } }
これは DataReader を呼び出す唯一のコードです。ロックがある場合、どのようにして 2 つのデータ リーダーを開くことができますか?