【发布时间】:2021-08-27 15:28:13
【问题描述】:
我有一个来自 Web 应用程序的 API 调用,它使用 Dapper 来查询一些结果并将它们返回给用户。但是,为什么这是异步工作的
IEnumerable<Task<Policy>> getPolicyTasks = from policy in policyList select GetPolicyDetailAsync(policy);
IEnumerable<Task<Policy>> tasks = policyList.Select(policy => Task.Run(() => GetPolicyDetailAsync(policy)));
var policyResults = await Task<Policy>.WhenAll(tasks);
但这不是吗?
List<Task<Policy>> getPolicyTasks = new List<Task<Policy>>();
foreach (var policy in policyList)
getPolicyTasks.Add(GetPolicyDetailAsync(policy));
var policyResults = await Task.WhenAll(getPolicyTasks);
policies = policyResults.ToList();
GetPolicyAsync 是一个简单的 Dapper SQL 调用,如下所示:
policies = await db.QueryAsync<Policy, Address, Policy>(sql,
(policy, address) =>
{
policy.Address = address;
return policy;
},
param: new { input = policy },
splitOn: "Address1");
return policy;
似乎我所有的 API 调用服务都需要使用 Task.Run() 来异步运行。为什么当方法是异步和等待时会出现这种情况?
【问题讨论】:
-
您使用的是哪个
SqlClient包System.Data.SqlClient或Microsoft.Data.SqlClient?以及为什么要在循环中执行此操作,而您只需执行一个查询即可一次获取所有PolicyDetail -
实际上是 IBM Net5.IBM.Data.Db2 (Informix)。我知道在这个特定区域一次完成所有操作可能更有意义,但这只是一个一般示例。我有一些长时间运行的数据库操作需要异步运行。
-
提供程序可能不是为正确使用
async而构建的 -
谢谢@Charlieface,你是对的。事实证明 IBM DB2 并不完全支持异步 - 感谢您的帮助。
-
正如我所说,您可能希望找到一种方法在一个查询中执行此操作。 DB2 是否支持表参数?
标签: c# .net async-await