异步等待每个问题

本文关键字:问题 等待 异步 | 更新日期: 2023-09-27 18:24:49

    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(( 永远不会完成,因为它调用了一个永无止境的函数,因此它不会到达帐户中的下一个字符串。

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

异步等待每个问题

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

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

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