为什么调用 OnlyOnCanceled 延续?
Why does the OnlyOnCanceled continuation get called?
当在下面的代码上调用 await RunAsync();
时,我希望 TaskContinuationOptions.OnlyRanToCompletion
延续到 运行,但是 OnlyOnCanceled
延续被调用(产生调试输出 "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);
}
你绑定了你的延续错误。
您不是在 "main" 任务中添加三个延续,而是在延续中添加延续。当主要任务无误地完成时,OnlyOnFaulted
延续将被取消,这会触发您错误地连接到 OnlyOnFaulted
延续而不是主要任务的 OnlyOnCanceled
延续。然后是最好的部分 - 这意味着第二个延续正确完成,并且由于您将最后一个延续连接到第二个延续,最后一个延续 运行s 也是如此,所以完整的输出是 "Task canceled. Task completed." : )
不过,您所期望的正确输出并不明显。你为什么首先使用延续? await
比您手动处理的要好得多。混合 await
和 ContinueWith
很少是一个好主意 :) 您是否正在尝试 await
主要任务(抛出异常时失败)?还是续集之一?或者只是 OnlyOnRanToCompletion
延续(这就是你现在正在做的,它永远不会按照你期望的方式工作)?如果该延续永远没有机会 运行 怎么办?
当在下面的代码上调用 await RunAsync();
时,我希望 TaskContinuationOptions.OnlyRanToCompletion
延续到 运行,但是 OnlyOnCanceled
延续被调用(产生调试输出 "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);
}
你绑定了你的延续错误。
您不是在 "main" 任务中添加三个延续,而是在延续中添加延续。当主要任务无误地完成时,OnlyOnFaulted
延续将被取消,这会触发您错误地连接到 OnlyOnFaulted
延续而不是主要任务的 OnlyOnCanceled
延续。然后是最好的部分 - 这意味着第二个延续正确完成,并且由于您将最后一个延续连接到第二个延续,最后一个延续 运行s 也是如此,所以完整的输出是 "Task canceled. Task completed." : )
不过,您所期望的正确输出并不明显。你为什么首先使用延续? await
比您手动处理的要好得多。混合 await
和 ContinueWith
很少是一个好主意 :) 您是否正在尝试 await
主要任务(抛出异常时失败)?还是续集之一?或者只是 OnlyOnRanToCompletion
延续(这就是你现在正在做的,它永远不会按照你期望的方式工作)?如果该延续永远没有机会 运行 怎么办?