【发布时间】:2019-08-27 13:26:33
【问题描述】:
我正在尝试从数据库 (GetAccountDetailAsync) 中查找一组帐户的帐户详细信息,并希望并行运行以使其更快。
[HttpPost]
public async Task<IHttpActionResult> GetAccountsAsync(IEnumerable<int> accountIds)
{
var resultAccounts = new List<AccountDetail>();
var task = Task.Run(() =>
{
Parallel.ForEach(accountIds, new ParallelOptions
{
MaxDegreeOfParallelism = 5
}, async accountId =>
{
var response = await GetAccountDetailAsync(accountId).ConfigureAwait(false);
resultAccounts.AddRange(response);
});
});
task.Wait();
return Ok(resultAccounts);
}
但是,虽然我有任务,但我没有得到结果。等待。 不知道为什么 task.Wait 没有被阻止。
“异步模块或处理程序已完成,而异步操作仍处于挂起状态。”
【问题讨论】:
-
您确定
task.Wait()在task完成执行之前不会阻塞执行吗? -
是的,我注意到了
-
完全删除
task(以及Task.Run和Wait),然后直接调用Parallel.ForEach。并删除Parallel.ForEach中的async。 -
请注意,您的代码并不安全,因为
List不是线程安全的——而且您似乎是从多个线程调用AddRange。你真的应该使用accountIds.AsParallel().StuffHere().ToList()。
标签: c# async-await asp.net-web-api2