Errore MultiThreading: esiste già un DataReader aperto associato a questa connessione che deve essere chiuso per primo

Ho un ciclo Parallel.Foreach

var options = new ParallelOptions(); options.MaxDegreeOfParallelism = 1; Parallel.ForEach(urlTable.AsEnumerable(),drow => { using (var WCC = new MasterCrawlerClass()) { WCC.MasterCrawlBegin(drow); } } 

Questo ciclo chiama la class e i loop su tutti i miei DataRows, tuttavia ognuno di questi datarows esegue un riempimento DataTable o esegue un comando di aggiornamento su un DB MySQL. Il codice che ho per entrambi è sotto.

 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); } } 

Il fatto è che il WCC contiene circa 10 vuoti, ognuno di questi vu si accede alle funzioni di MySQL almeno una volta. Quindi se il blocco è la risposta, è ansible creare 1 funzione di blocco per tutti i vuoti? Se é cosi, come? Se c’è un altro modo, per favore fatemelo sapere

Grazie!

Ok come suggerito ho consolidato le domande

Il codice ora è stato aggiornato per riflettere il blocco, vedi sotto.

static readonly object _object = new object();

  public static DataTable DTTable (string mysqlQuery, string queryName)
         {
             lock (_object)
             {
                 DataTable DTTableTable = new DataTable ();
                 provare
                 {
                     utilizzando (MySqlDataAdapter DataDTTables = new MySqlDataAdapter (mysqlQuery, MySQLProcessing.MySQLStatic.Connection))
                     {
                         utilizzando (DataTable DataDTTablesDT = new DataTable ())
                         {
                             DataDTTables.SelectCommand.CommandTimeout = 240000;
                             DataDTTables.Fill (DataDTTablesDT);
                             DTTableTable = DataDTTablesDT;
                             DataDTTables.Dispose ();
                         }
                     }

                 }
                 cattura (eccezione ex)
                 {

                     GenericLogging ("MySQLquery non riuscito:" + ex.Message.ToString (), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery);

                 }
                 return DTTableTable;
             }
         } 

Questo è l’unico codice che chiama DataReader, come possono esserci due lettori di dati aperti se c’è un blocco?

Il problema è che i fornitori di dati ADO.NET generalmente non consentono più di un lettore di dati aperto alla volta per connessione. SQL Server ha il concetto di più set di risultati attivi (MARS) , ma per quanto ne so MySQL non lo supporta ancora.

Probabilmente dovrai specificare una connessione diversa oltre a MySQLProcessing.MySQLStatic.Connection . Non c’è nulla che ti impedisca di usare più di una connessione. Il problema qui è che le connessioni sono risorse costose quindi si suppone che le si utilizzi con parsimonia.

Stai utilizzando la stessa connessione allo stesso tempo.

Avete diversi thread? Perché sembra che 2 thread utilizzino la stessa connessione per effettuare contemporaneamente una chiamata.