我有一个任务数组,并使用 Task.WhenAll
等待这些任务。我的任务经常失败,如果发生故障,我会弹出一个消息框通知用户以便重试。我的问题是报告错误直到所有任务完成才被延迟。相反,我希望在第一个任务引发异常时立即通知用户。换句话说,我想要一个快速失败的版本 Task.WhenAll
。由于没有内置的此类方法,我尝试制作自己的方法,但我的实现不符合我的预期。以下是我的解决方案:
public static async Task<TResult[]> WhenAllFailFast<TResult>(
params Task<TResult>[] tasks)
{
foreach (var task in tasks)
{
await task.ConfigureAwait(false);
}
return await Task.WhenAll(tasks).ConfigureAwait(false);
}
这通常比本机的Task.WhenAll
更快,但通常速度还不够快。故障任务#2在任务#1完成之前不会被观察到。我应该如何改进它,以使其尽快失败?
更新:关于取消,当前不在我的要求范围内,但假设为了一致性,第一个取消的任务应该立即停止等待。在这种情况下,从WhenAllFailFast
返回的组合任务应该具有Status == TaskStatus.Canceled
。
澄清:取消场景是用户点击“取消”按钮停止任务完成,而不是在出现异常时自动取消未完成的任务。
WhenAllError
,需要一个CancellationToken
作为参数,并且无法编译。删除与CancellationToken
相关的代码会导致该方法陷入无限循环。这显然不是解决我的问题的方法。 - Theodor Zoulias