を閉じる必要があります。この接続に関連付けられているオープンのDataReaderが既にあり、私はこのループは、しかし、それぞれのクラスを呼び出し、すべての私でDataRowをループParallel.Foreachループにマルチスレッド・エラー:最初の
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 1;
Parallel.ForEach(urlTable.AsEnumerable(),drow =>
{
using (var WCC = new MasterCrawlerClass())
{
WCC.MasterCrawlBegin(drow);
}
}
を持っていますこれらのデータローは、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();
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を呼び出すコードだけが、どのように2人のオープンデータの読者があることができますか?
私が間違っていない場合、問題は、voidを返すものではなく、DataTableを返すメソッドにあります。問題を回避するために接続プールを実装することがあります。 – phoog