gpt4 book ai didi

.net - 为什么 Task.WhenAll 抛出 TaskCanceledException 和 Task.WhenAny 不在同一个测试用例中

转载 作者:行者123 更新时间:2023-12-01 06:21:13 28 4
gpt4 key购买 nike

我运行这个代码:

var cancellation = new CancellationTokenSource();
var cancelledTask1 = .....;//starting new long-running task that accepts cancellation.Token
var cancelledTask2 = .....;//starting new long-running task that accepts cancellation.Token

//then I request cancellation
cancellation.Cancel();
//some task gets cancelled before code below executes
try
{
//wait for completion (some task is already in cancelled state)
await Task.WhenAll(cancelledTask1, cancelledTask2);
}
catch (OperationCanceledException e)
{
Logger.Debug("await WhenAll", e);
}

我得到
await WhenAll System.Threading.Tasks.TaskCanceledException: A task was canceled.

我认为它会因为某些任务已经处于取消状态而停止。为什么 Task.WhenAll方法中断正常流程并在取消子任务的情况下引发异常?这种行为有什么好处?

然后,我尝试方法 Task.WhenAny :
var cancellation = new CancellationTokenSource();
var cancelledTask3 = .....;//starting new long-running task that accepts cancellation.Token

//then I request cancellation
cancellation.Cancel();
//the task gets cancelled before code below executes
try
{
//wait for completion (the task is already in cancelled state)
await Task.WhenAny(cancelledTask3);
}
catch (OperationCanceledException e)
{
Logger.Debug("await WhenAny", e);
}

并且它不会抛出异常。

第二个问题是:为什么 Task.WhenAny在同一种情况下不会抛出异常?我希望这两种方法都应该以相同的方式处理取消的任务:要么抛出异常,要么不抛出。

最佳答案

Task.WhenAny旨在在其中一项任务完成时完成,其中完成包括失败。当其中一项任务可能失败时,我实际上发现它最有用。例如:

try
{
await Task.WhenAny(task1,task2);
cancellationToken.Cancel(); //cancel all tasks
await Task.WhenAll(task1,task2); //wait for both tasks to respect the cancellation
}
catch (Exception x)
{
...
}

在这里,我只需要完成一项任务(因此, WhenAny )。在这种情况下,我也想取消其他任务。然后我打电话 WhenAll等待其他任务尊重取消请求,并在发生异常时传播异常。

换句话说, Task.WhenAny旨在让您在其他任务仍在运行时执行某些操作,并且不抛出异常以便您对其他任务执行任何您想做的事情非常有用。 Task.WhenAll仅在所有任务完成(成功与否)时才完成。它可以抛出异常,因为你没有什么可以处理的了,计算已经完成。

关于.net - 为什么 Task.WhenAll 抛出 TaskCanceledException 和 Task.WhenAny 不在同一个测试用例中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18208508/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com