【问题标题】:Async await foreach issue [closed]异步等待 foreach 问题 [关闭]
【发布时间】:2014-11-23 06:16:58
【问题描述】:
    private async void btnLoadFile_Click(object sender, EventArgs e)
    {
       if(AccountsFile.ShowDialog()==DialogResult.OK)
       {
           Accounts = File.ReadAllLines(AccountsFile.FileName);  
           foreach(string str in Accounts)
           {
               await LoadAccount(str);
           }
       }
    }

我遇到了一个问题,我知道异步编程是如何工作的,它会等待任务完成,但 LoadAccount() 永远不会完成,因为它调用了一个带有永无止境的 while 循环的函数,所以它不会到达Accounts 中的下一个字符串。

我不知道从哪里开始解决这个问题。有什么解决办法吗?

【问题讨论】:

  • 函数永远不会结束,而循环听起来像是一个你应该开始的问题。
  • 永无止境的while循环对我的程序很重要。
  • 比寻找Fire and forget:调用你的方法,但不要等待它。

标签: c# asynchronous foreach while-loop async-await


【解决方案1】:

您可以集体等待它们,而不是依次等待每个帐户。这样,即使您的一个帐户进入无限循环,其他帐户仍然可以继续加载。

Accounts = File.ReadAllLines(AccountsFile.FileName);  
Task completionTask = Task.WhenAll(Accounts.Select(LoadAccount));

您通常希望将completionTask 存储在类变量中。随后,当您在 LoadAccount 调用中跳出无限循环时(例如,通过轮询的 CancellationToken 发出取消信号),您可以使用此 completionTask 来等待您的所有任务完成。

【讨论】:

  • 所有账户都需要无限循环。
  • @Aidan:在这种情况下,我会选择MarcinJuraszek's suggestion:保留您的原始代码,但只需删除await(以使其“一劳永逸”)。跨度>
猜你喜欢
  • 2020-01-03
  • 2019-06-28
  • 2021-12-18
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2022-10-25
相关资源
最近更新 更多