C# 为什么唯一的人会被呼叫?
调用wait RunAsync时;在下面的代码中,我希望使用TaskContinuationOptions.OnlyRanToCompletion continuation运行continuation,但是调用onlyoncancelled continuation会导致调试输出任务被取消 为什么?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延续将被取消,这将触发
你把你的续集装订错了 不是向主任务添加三个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);
}