【问题标题】:Why does the OnlyOnCanceled continuation get called?为什么调用 OnlyOnCanceled 延续?
【发布时间】:2016-09-30 17:33:52
【问题描述】:

在下面的代码上调用await RunAsync(); 时,我希望TaskContinuationOptions.OnlyRanToCompletion 继续运行,但是OnlyOnCanceled 继续被调用(产生调试输出“任务取消”)。

为什么?

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

}

【问题讨论】:

    标签: c# async-await task continuations cancellation


    【解决方案1】:

    你绑定你的延续错误。

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-22
      • 2012-01-22
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 2016-01-18
      • 2020-06-21
      相关资源
      最近更新 更多