异步等待foreach问题

时间:2014-09-28 21:48:20

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

    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循环的函数,所以它不会到达帐户中的下一个字符串。

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

1 个答案:

答案 0 :(得分:1)

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

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

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