2014-09-28 114 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