C# 为什么唯一的人会被呼叫?

C# 为什么唯一的人会被呼叫?,c#,async-await,task,continuations,cancellation,C#,Async Await,Task,Continuations,Cancellation,调用wait RunAsync时;在下面的代码中,我希望使用TaskContinuationOptions.OnlyRanToCompletion continuation运行continuation,但是调用onlyoncancelled continuation会导致调试输出任务被取消 为什么? 你把你的续集装订错了 不是向主任务添加三个continuation,而是将continuation添加到continuation。当主任务顺利完成时,OnlyOnFaulted延续将被取消,这将触发

调用wait RunAsync时;在下面的代码中,我希望使用TaskContinuationOptions.OnlyRanToCompletion continuation运行continuation,但是调用onlyoncancelled continuation会导致调试输出任务被取消

为什么?


你把你的续集装订错了

不是向主任务添加三个continuation,而是将continuation添加到continuation。当主任务顺利完成时,OnlyOnFaulted延续将被取消,这将触发错误连接到OnlyOnFaulted延续而非主任务的OnlyOnCancelled延续。然后是最好的部分-这意味着第二个继续正确完成,并且由于您将上一个继续连接到第二个继续,最终的继续也会运行,因此完整的输出被任务取消。任务已完成。:

不过,您期望的正确输出并不明显。你为什么要用连续体呢?Wait可以为您更好地处理这些问题,这比您手动完成的工作要好得多。将wait和ContinueWith混合使用很少是一个好主意:当抛出异常时,您是否试图等待主任务失败?还是其中一种延续?或者仅仅是你现在正在做的唯一一件事,它永远不会按照你期望的方式工作?如果那部续集再也没有机会跑呢

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);

}