Principales respuestas
System.InvalidOperationException: 'No se puede iniciar otra operación mientras hay una operación asincrónica pendiente.'

Pregunta
-
Tengo este codigo y Ejecuta Correctamente hasta que chocan las operaciones asincronas:
public void insertInTable(string tipoConexion, List<string> allTables) { SqlCommand cmdSQLMonitorP; SqlDataReader dr; switch (tipoConexion) { case "SQL": SqlConnection SQLMonitorp = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnDB_MP"].ToString()); SQLMonitorp.OpenAsync(); NpgsqlConnection SQLOptimizer = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["OptimizerPSQL"].ToString()); SQLOptimizer.Open(); Parallel.ForEach(allTables, async table => { try { cmdSQLMonitorP = new SqlCommand("Select * from " + table.ToString(), SQLMonitorp); dr = await cmdSQLMonitorP.ExecuteReaderAsync(); if (await dr.ReadAsync()) { NpgsqlCommand cmdSQLOptimizer = new NpgsqlCommand($"INSERT INTO mpo_trainingdata " + $"(uuid,uuidorganizationnode,uuidmodule,uuidrecord,data,transactiondate,transactiontime," + $"isfraud,random,source,transactionid,transactiondata) VALUES (" + $"'{Guid.NewGuid().ToString().ToUpper()}'," + $"'a8842958'," + $"'D8C79BEF-937B-4EFE-A51A-20B977CCB14F'," + $"'BFDEC28D-7E26-4696-B4AB-B42503B06A02'," + $"'{dr["VWJETEXTO"].ToString()}'," + $"{Convert.ToInt64(dr["VWJEFECHA"])}," + $"{Convert.ToInt64(dr["VWJEHORA"])}," + $"'{Convert.ToBoolean(dr["VWJEFRAUD"])}'," + $"{Convert.ToInt64(dr["VWRANDOM"])}," + $"{Convert.ToInt64(dr["VWORIGEN"])}," + $"'{dr["VWJENUMEVENTO"].ToString()}')", SQLOptimizer); await cmdSQLOptimizer.ExecuteNonQueryAsync(); dr.Close(); } dr.Close(); } catch (Exception ex) { throw ex; } }); SQLOptimizer.Close(); SQLMonitorp.Close(); break; } Thread.Sleep(0); }
allTables es una lista de Tablas a las cuales les quiero hacer la consula asincrona. e insertarlas a una tabla de otra base de datos.
Respuestas
-
Aca encontre una Solucion:
https://markheath.net/post/constraining-concurrent-threads-csharp- Marcado como respuesta Josue Garcia Monterroso miércoles, 5 de febrero de 2020 17:53
Todas las respuestas
-
hola
Estas seguro que sabes como programar en paralelismo? porque haces cosas no no estan permitidas
No puede definir objetos de forma global como lo haces con cmdSQLMonitor, dr
lo tienes que definir dentro del codigo del Parallel.ForEach, recuerda que ejecuta en paralelo, cuando haces el new, otro new de un thread diferente pisa la instancia del otro objeto generando un desastre
Recomendaria ademas en este caso no uses reader, mejor usa el datatable para obtener los datos, un objeto desconectado genera menos problemas cuando trabajas con hilos
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Editado Leandro TuttiniMVP martes, 4 de febrero de 2020 23:35
- Propuesto como respuesta Diana AcuñaModerator martes, 4 de febrero de 2020 23:53
-
Hola Leandro gracias por tu ayuda,
es la primera vez que trabajo con paralelisto y con threads,
tengo ese problema cuando coloco el objeto cmdSQLMonitor y el SQLOptimizer dentro del Parallel.ForEach
se genera la conexion tantas veces que el servidor deja de responder.
en este caso al for le envio 37 tablas son 37 conexiones y 37 consultas para hacer 37 inserts. -
Aca encontre una Solucion:
https://markheath.net/post/constraining-concurrent-threads-csharp- Marcado como respuesta Josue Garcia Monterroso miércoles, 5 de febrero de 2020 17:53