Task.WaitAll与已取消的任务

3

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

2
“WaitAll” 不会等待所有任务完成,这应该使用 “WaitAny”。 - Adam Houldsworth
但是然后它们未被处理。我假设他希望处理他的异常。 - Yuval Itzchakov
@Adam 但是这样做,可能会忽略掉任何可能发生的异常。 - Yuval Itzchakov
@YuvalItzchakov 确实如此。在这种情况下,这与所要求的相反。如果那是一个很大的问题,捕获异常并过滤取消将是正确的方法。我正在耐心地等待正确的答案,因为我的经验有限。 - Adam Houldsworth
我稍微编辑了一下帖子以澄清问题。 - Teddy Bo
显示剩余5条评论
1个回答

2

当你想要同时处理成功和失败的情况时,我认为没有必要将它们放在不同的ContinueWith()调用中。只需一个始终会发生的调用即可:

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

continuation.Wait();

假设task永远不会被取消,这将与您的原始代码基本相同。

谢谢你,svick。通常我使用你所描述的方法。但有时候,有两个不同的ContinueWith会更好,例如当“成功”的ContinueWith需要自己的ContinueWith,或者“成功”和“失败”的ContinueWith有不同的调度程序时。 - Teddy Bo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接