2014-09-28 113 views
-4
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()将永远不会完成,因为它调用一个永无止境的,而一个功能因此它不会到达账户中的下一个字符串。异步等待的foreach问题

我不知道从哪里开始解决这个问题。任何解决方案

+5

功能与永不停止while循环听起来像一个问题,你应该开始。 – MarcinJuraszek 2014-09-28 21:50:34

+0

无尽的while循环对我的程序很重要。 – Aidan 2014-09-28 21:51:52

+0

比寻找*火和忘记*:打电话给你的方法,但不要等待它。 – MarcinJuraszek 2014-09-28 22:05:05

回答

1

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

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

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

+0

所有帐户都需要无限循环。 – Aidan 2014-09-28 22:04:26

+0

@Aidan:在这种情况下,我会去[MarcinJuraszek的建议](http://stackoverflow.com/questions/26090002/async-await-foreach-issue/26090053#comment40882956_26090002):保留您的原始代码,但只是删除“等待”(以便使它“开火并忘记”)。 – Douglas 2014-09-29 06:14:23