¿Cómo lidiar con posibles grandes cantidades de tareas usando async / await?

async-await c# dapper task

Pregunta

Tengo una función de Azure que consulta una base de datos con Dapper y lanza estas excepciones a veces:

  • System.InvalidOperationException: operación no válida. La conexión está cerrada.

  • System.InvalidOperationException: la operación solicitada no se puede completar porque la conexión se ha roto.

Esto es lo que mi código está haciendo:

using (var conn = new SqlConnection(_dbConnectionString))
{
      await conn.OpenAsync();
      List<Guid> ids = await conn.QueryAsync<Guid>("SELECT Id From Table1;");

      var tasksRelations = ids.Select(id => conn.QueryAsync<CsvExport>(
                                      @"SELECT Field1, Field2, ... Field25 
                                        FROM Table2 
                                        WHERE Table1Id = @Id;", 
                                       new { id }));

      var relations = await Task.WhenAll(tasksRelations);
}

Esto funciona bien cuando la cantidad de identificadores es baja, pero cuando se hace más grande tengo excepciones anteriores.

¿Tiene alguna idea o cosas que hacer para que este código sea más robusto?

Respuesta aceptada

Está intentando disparar múltiples consultas contra la misma conexión al mismo tiempo. Esta es una mala idea y es probable que haya un error inicial que no haya informado aquí que indique algo acerca de tener múltiples conjuntos de resultados abiertos en la misma conexión que no son compatibles.

En lugar de ejecutar tantas consultas, simplifique su código para obtener los resultados que desea en una sola consulta:

using (var conn = new SqlConnection(_dbConnectionString))
{
      await conn.OpenAsync();
      var relations = conn.QueryAsync<CsvExport>(
                                      @"SELECT Field1, Field2, ... Field25 
                                        FROM Table2 
                                        WHERE Table1Id IN (SELECT Id From Table1);");
}

Ahora no tiene que lidiar con "grandes números" de tareas y solo está ejecutando una consulta en la conexión y, por lo tanto, no debería generar los errores.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué