如何使用 async/await 处理潜在的大量任务?
How to deal with potential big numbers of Tasks using async/await?
我有一个 Azure 函数,它使用 Dapper 查询数据库并有时抛出此异常:
System.InvalidOperationException: Invalid operation. The connection is closed.
System.InvalidOperationException: The requested operation cannot be completed because the connection has been broken.
这是我的代码正在做的事情:
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" 项任务,并且您只是 运行 一个连接查询,因此不应生成错误。
我有一个 Azure 函数,它使用 Dapper 查询数据库并有时抛出此异常:
System.InvalidOperationException: Invalid operation. The connection is closed.
System.InvalidOperationException: The requested operation cannot be completed because the connection has been broken.
这是我的代码正在做的事情:
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" 项任务,并且您只是 运行 一个连接查询,因此不应生成错误。