为了账号安全,请及时绑定邮箱和手机立即绑定

控制器并行调用时如何等待结果

控制器并行调用时如何等待结果

C#
白板的微信 2023-09-24 11:39:52
我正在尝试从数据库 (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 没有被阻止。“异步模块或处理程序已完成,而异步操作仍处于挂起状态。”
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

Parallel.ForEach不适用于操作async,但您可以使用以下命令启动所有任务,然后等待它们全部完成Task.WhenAll:


[HttpPost]

public async Task<IHttpActionResult> GetAccountsAsync(IEnumerable<int> accountIds)

{

    Task<List<AccountDetail>>[] tasks = accountIds.Select(accountId => GetAccountDetailAsync(accountId)).ToArray();

    List<AccountDetail>[] results = await Task.WhenAll(tasks);

    return Ok(results.SelectMany(x => x).ToList());

}


查看完整回答
反对 回复 2023-09-24
?
青春有我

TA贡献1784条经验 获得超8个赞

GetAccountDetail假设您拥有或可以轻松获得没有异步部分的方法,这将是最简单的方法:


[HttpPost]

public async Task<IHttpActionResult> GetAccountsAsync(IEnumerable<int> accountIds)

{

   var resultList = accountIds.AsParallel()

                              .WithDegreeOfParallelism(5)

                              .Select(GetAccountDetail)

                              .ToList();

   return Ok(resultList);

}


查看完整回答
反对 回复 2023-09-24
  • 2 回答
  • 0 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信