- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的代码上调用 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
比您手动处理的要好得多。混合使用 await
和 ContinueWith
很少是个好主意 :) 您是否正在尝试 await
主要任务(抛出异常时失败)?还是续集之一?或者只是 OnlyOnRanToCompletion
延续(这就是您现在正在做的事情,它永远不会按照您期望的方式工作)?如果该延续永远没有机会运行怎么办?
关于c# - 为什么调用 OnlyOnCanceled 延续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37567142/
在下面的代码上调用 await RunAsync(); 时,我希望继续运行 TaskContinuationOptions.OnlyRanToCompletion 继续运行,但是 OnlyOnCanc
微软70-483考试引用书CancellationToken的使用,第一种用signal取消的方式是抛异常,然后介绍第二种: Instead of catching the exception, yo
我正在试验 .NET 4.0 中的任务支持 - 特别是延续支持。我感到困惑的是,我不知道如何继续使用 TaskContinuationOptions.OnlyOnCanceled标志设置为执行。如果我
我是一名优秀的程序员,十分优秀!