gpt4 book ai didi

c# - Task.WaitAll 和取消的任务

转载 作者:行者123 更新时间:2023-11-30 16:57:26 32 4
gpt4 key购买 nike

我有两个 ContinueWith 用于一个任务。第一个处理任务成功完成的情况,第二个处理任务失败的情况。然后我等到其中一个完成。示例代码如下:

var task = Task.Factory.StartNew(() => { Console.WriteLine("Task is finished"); });
var success = task.ContinueWith(
t => Console.WriteLine("Success")
, TaskContinuationOptions.OnlyOnRanToCompletion
);
var failed = task.ContinueWith(
t => Console.WriteLine("Failed")
, TaskContinuationOptions.NotOnRanToCompletion
);

try
{
Task.WaitAll(success, failed);
}
catch (AggregateException ex)
{
Console.WriteLine(ex.InnerException.Message);
}

我的问题是,是否可以重写它以避免引发 TaskCanceledException?

最佳答案

当您希望同时拥有成功和失败的处理程序时,我认为没有太多理由将它们放在单独的 ContinueWith() 调用中。一个电话,总是会发生的应该足够了:

var continuation = task.ContinueWith(
t =>
{
if (t.IsFaulted)
Console.WriteLine("Failed");
else
Console.WriteLine("Success");
});

continuation.Wait();

假设 task 永远不会被取消,这将表现得与您的原始代码几乎相同。

关于c# - Task.WaitAll 和取消的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26502533/

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