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

How to deal with potential big numbers of Tasks using async/await?

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

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

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 数量较少时,这工作正常,但当它变大时,我有上述异常。

您有什么想法或事情可以使这段代码更健壮吗?

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

相比 运行 如此多的查询,简化 您的代码以在 单个 查询中获得您想要的结果:

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

现在您不必处理 "big numbers" 项任务,并且您只是 运行 一个连接查询,因此不应生成错误。