如何使用async / await处理潜在的大量任务?

时间:2018-04-20 14:17:36

标签: c# async-await task dapper

我有一个使用Dapper查询数据库的Azure函数,并且有时会抛出此异常:

  •   

    System.InvalidOperationException:无效的操作。连接已关闭。

  •   

    System.InvalidOperationException:由于连接已断开,无法完成请求的操作。

这是我的代码正在做的事情:

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

当id的数量很少时,这种方法很好,但是当它变大时,我有以上例外情况。

您是否有任何想法或事情可以使此代码更加健壮?

1 个答案:

答案 0 :(得分:2)

您尝试同时针对同一连接触发多个查询。这是一个坏主意,并且可能存在一个初始错误,您在此处未报告该错误说明在同一连接上打开多个结果集不受支持。

简化代码以获取单个查询中所需的结果,而不是运行这么多查询:

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

现在您不必处理“大数”任务,并且您只在连接上运行一个查询,因此不应生成错误。