mam pętlę Parallel.Foreachbłąd Wielowątkowość: Jest już otwarty DataReader skojarzony z tym połączeniem, które muszą być zamknięte pierwszy
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 1;
Parallel.ForEach(urlTable.AsEnumerable(),drow =>
{
using (var WCC = new MasterCrawlerClass())
{
WCC.MasterCrawlBegin(drow);
}
}
Pętla ta wywołuje klasę i pętle za pośrednictwem wszystkich moich wierszy DataRows, jednak każdy z te pliki danych albo wypełniają DataTable, albo wykonują polecenie aktualizacji do MySQL DB. Kod, który mam dla obydwu, znajduje się poniżej.
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);
}
}
Rzecz WCC zawiera 10 lub tak pustych przestrzeni, przy czym wszystkie puste przestrzenie uzyskuje dostęp do funkcji MySQL co najmniej raz. Więc jeśli blokowanie jest odpowiedzią, czy jest możliwe utworzenie 1 funkcji blokowania dla wszystkich pustek? Jeśli tak to jak? Jeśli jest inny sposób, proszę dać mi znać
Dzięki!
Ok jak sugerowano i skonsolidowane pytania
Kod został obecnie aktualizowane w celu odzwierciedlenia zamek, można znaleźć poniżej.
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; } }
To jest tylko kod, który wywołuje DataReader, jak może istnieć dwie otwarte czytniki danych, jeśli istnieje blokada?
Jeśli się nie mylę, problemem jest metoda, która zwraca DataTable, a nie tę, która zwraca pustkę. Możesz zaimplementować pulę połączeń, aby ominąć problem. – phoog