gpt4 book ai didi

c# - 为什么调用 OnlyOnCanceled 延续?

转载 作者:行者123 更新时间:2023-11-30 20:35:50 28 4
gpt4 key购买 nike

在下面的代码上调用 await RunAsync(); 时,我希望继续运行 TaskContinuationOptions.OnlyRanToCompletion 继续运行,但是 OnlyOnCanceled continuation 被调用(产生调试输出“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);

}

最佳答案

你错误地绑定(bind)了你的延续。

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

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

关于c# - 为什么调用 OnlyOnCanceled 延续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37567142/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com