Task.WaitAll和已取消的任务

本文关键字:任务 取消 WaitAll Task | 更新日期: 2023-09-27 18:27:21

一个任务有两个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?

Task.WaitAll和已取消的任务

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

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

假设task永远不会被取消,那么它的行为将与原始代码几乎相同。