亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

控制器并行調用時如何等待結果

控制器并行調用時如何等待結果

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 沒有被阻止?!爱惒侥K或處理程序已完成,而異步操作仍處于掛起狀態。”
查看完整描述

2 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

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 關注
  • 142 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號