que tienen un bucle Parallel.Foreacherror multihilo: Ya hay un DataReader abierto asociado con esta conexión que debe estar cerrada primera
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 1;
Parallel.ForEach(urlTable.AsEnumerable(),drow =>
{
using (var WCC = new MasterCrawlerClass())
{
WCC.MasterCrawlBegin(drow);
}
}
Este bucle llama a la clase y recorre todos mis DataRows, sin embargo cada uno de esos datarows hacen un relleno DataTable o un comando de actualización a un DB MySQL. El código que tengo para ambos está abajo.
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);
}
}
la cosa es CMI contiene 10 o más huecos, cada uno de estos huecos accede a las funciones de MySQL al menos una vez. Entonces, si el bloqueo es la respuesta, ¿es posible crear 1 función de bloqueo para todos los vacíos? ¿Si es así, cómo? Si hay otra manera, por favor hágamelo saber
¡Gracias!
bien como lo sugiere Consolidé las preguntas
El código ahora se ha actualizado para reflejar bloqueo, por favor ver más abajo.
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; } }
Este es el único código que llama el DataReader, ¿cómo puede haber dos lectores de datos abiertas si hay una cerradura?
Si no me equivoco, el problema está en el método que devuelve DataTable, no en el que devuelve vacío. Puede implementar un grupo de conexiones para evitar el problema. – phoog