为什么调用 OnlyOnCanceled 延续?

Why does the OnlyOnCanceled continuation get called?

当在下面的代码上调用 await RunAsync(); 时,我希望 TaskContinuationOptions.OnlyRanToCompletion 延续到 运行,但是 OnlyOnCanceled 延续被调用(产生调试输出 "Task canceled")。

为什么?

private static async Task RunAsync()
{
    try
    {
        await Task.Run(() => DoWork())
            .ContinueWith(
                (t) =>
                {
                    if (t?.Exception != null)
                    {
                        throw t.Exception;
                    }
                }, TaskContinuationOptions.OnlyOnFaulted
            ).ContinueWith(
                (t) =>
                {
                    Debug.WriteLine("Task canceled.");
                }, TaskContinuationOptions.OnlyOnCanceled
            ).ContinueWith(
                (t) =>
                {
                    Debug.WriteLine("Task completed.");
                }, TaskContinuationOptions.OnlyOnRanToCompletion);

    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
}

private static void DoWork()
{
    Thread.Sleep(1000);

}

你绑定了你的延续错误。

您不是在 "main" 任务中添加三个延续,而是在延续中添加延续。当主要任务无误地完成时,OnlyOnFaulted 延续将被取消,这会触发您错误地连接到 OnlyOnFaulted 延续而不是主要任务的 OnlyOnCanceled 延续。然后是最好的部分 - 这意味着第二个延续正确完成,并且由于您将最后一个延续连接到第二个延续,最后一个延续 运行s 也是如此,所以完整的输出是 "Task canceled. Task completed." : )

不过,您所期望的正确输出并不明显。你为什么首先使用延续? await 比您手动处理的要好得多。混合 awaitContinueWith 很少是一个好主意 :) 您是否正在尝试 await 主要任务(抛出异常时失败)?还是续集之一?或者只是 OnlyOnRanToCompletion 延续(这就是你现在正在做的,它永远不会按照你期望的方式工作)?如果该延续永远没有机会 运行 怎么办?