none
System.InvalidOperationException: 'No se puede iniciar otra operación mientras hay una operación asincrónica pendiente.' RRS feed

  • 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.
    martes, 4 de febrero de 2020 21:48

Respuestas

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


    martes, 4 de febrero de 2020 23:33
  • 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.
    miércoles, 5 de febrero de 2020 13:23
  • miércoles, 5 de febrero de 2020 17:53