TaskCanceledException 与 ContinueWith

TaskCanceledException with ContinueWith

我一直在努力弄清楚为什么我会因为一些最近开始出现异常的异步代码而收到 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,我不知道它来自哪里!

您使用了错误的任务继续选项:

见下文link:https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcontinuationoptions%28v=vs.110%29.aspx

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

正如上面所说的那样,这个调用只需要处于故障状态的先行任务,否则将抛出 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'
        });