Task.WaitAll和取消的任务

时间:2014-10-22 07:46:13

标签: c# task-parallel-library

我有两个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?

1 个答案:

答案 0 :(得分:2)

当你想要成功和失败的处理程序时,我没有太多理由让它们分开进行ContinueWith()次呼叫。一次电话会发生,这应该就足够了:

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

continuation.Wait();

假设永远不会取消task,这与原始代码的行为几乎相同。