【发布时间】:2015-12-22 02:00:59
【问题描述】:
简而言之,我有一个可枚举的任务,我想以 await 方式运行数组中的每个任务。每个任务都将执行缓慢的网络操作,因此我只需要在任务完成后更新 WinForm UI。
以下是我目前正在使用的代码,但我认为这更像是一种 hack,而不是实际的解决方案:
private void btnCheckCredentials_Click(object sender, EventArgs e)
{
// GetNetCredentials() is irrelevant to the question...
List<NetworkCredential> netCredentials = GetNetCredentials();
// This call is not awaited. Displays warning!
netCredentials.ForEach(nc => AwaitTask(ValidateCredentials(nc)));
}
public async Task<bool> ValidateCredentials(NetworkCredential netCredential)
{
// Network-reliant, slow code here...
}
public async Task AwaitTask(Task<bool> task)
{
await task;
// Dumbed-down version of displaying the task results
txtResults.Text += task.Result.ToString();
}
显示第二行 btnCheckCredentials_Click() 警告:
由于不等待此调用,因此在调用完成之前继续执行当前方法。考虑将 'await' 运算符应用于调用结果。
这实际上按我想要的方式工作,因为我不想等待操作完成。相反,我只想启动任务,然后在每个任务完成后立即做一些事情。
Task.WhenAny() 或 Task.WhenAll() 方法确实如我所愿,因为我想知道每项任务的完成情况——只要它完成。 Task.WaitAll() 或 Task.WaitAny() 是阻塞的,因此也是不可取的。
编辑:所有任务应该同时开始。然后他们可以按任何顺序完成。
【问题讨论】:
标签: winforms c#-4.0 async-await task