使用ContinueWith的TaskCanceledException

时间:2015-02-20 16:38:33

标签: c# .net task

我一直在试图找出为什么我得到一个最近开始行为不端的异步代码的TaskCanceledException。我把我的问题缩减为一个让我挠头的小代码片段:

static void Main(string[] args)
{
    RunTest();
}

private static void RunTest()
{
    Task.Delay(1000).ContinueWith(t => Console.WriteLine("{0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted).Wait();
}

据我所知,这应该暂停一秒然后关闭。不会调用ContinueWith(这仅适用于我的实际用例)。但是,相反,我得到了一个TaskCanceledException,我不知道它来自哪里!

2 个答案:

答案 0 :(得分:2)

您使用的是错误的taskcontinuationoption:

请参阅以下链接:https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcontinuationoptions%28v=vs.110%29.aspx

它说: 指定仅在其前件抛出未处理的异常时才应安排延续任务。此选项对多任务延续无效。

答案 1 :(得分:0)

正如上面所说的,此调用只需要处于故障状态的前提任务,否则将抛出TaskCanceledException,对于这种具体情况,您可以将ContinueWith泛化为处理所有状态:

await Task.Delay(1000).ContinueWith(
    task => 
        {
            /* take into account that Canceled-task throw on next row the TaskCancelledException */

            if (!task.IsFaulted) {
                return;
            }

            Console.WriteLine("{0}", task.Exception);
            // do smth like 'throw task.Exception.InnerException'
        });