c# - 等待具有 OnlyOnFaulted Continuation 的任务会导致 AggregateException

标签 c# parallel-processing task task-parallel-library pfx

我有一些简单的代码作为重现:

var taskTest = Task.Factory.StartNew(() =>
{
    System.Threading.Thread.Sleep(5000);

}).ContinueWith((Task t) =>
{
    Console.WriteLine("ERR");
}, TaskContinuationOptions.OnlyOnFaulted);

try
{
    Task.WaitAll(taskTest);
}
catch (AggregateException ex)
{
    foreach (var e in ex.InnerExceptions)
        Console.WriteLine(e.Message + Environment.NewLine + e.StackTrace);
}

但是,我在 try catch block 中抛出了意外的 TaskCanceledException(它在 AggregateException InnerExceptions 对象中)。 “任务已取消”。

为什么我会收到此异常?任务的延续从未触发,它没有产生异常,但我在等待时仍然得到聚合异常....

我希望有人能解释这对我来说有何意义:)

最佳答案

您不是在等待具有 OnlyOnFaulted 延续的任务 - 您是在等待该延续(由 ContinueWith 返回)。延续永远不会触发,因为原始任务正常返回,所以它就像被取消一样。

对我来说很有意义。

我怀疑您想创建任务,添加延续,然后等待原始任务:

var taskTest = Task.Factory.StartNew(() =>
{
    System.Threading.Thread.Sleep(5000);

});
taskTest.ContinueWith((Task t) =>
{
    Console.WriteLine("ERR");
}, TaskContinuationOptions.OnlyOnFaulted);

关于c# - 等待具有 OnlyOnFaulted Continuation 的任务会导致 AggregateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6573720/

相关文章:

C# 为所有可选参数提供值

c# - .NET MVC——使用一个类作为模型?

C# 开源软件会从并行化中受益吗?

c# - 并行执行多对并发任务

c# - 为什么我的代码抛出 `The semaphore has been disposed` 异常?

c# - 将 Action 与 Task 结合使用 - 不确定它是如何工作的

c# 字符串数组未显示

c# - 在 win 8.1 上引发 Toast Notification 的 C# 桌面应用程序在升级到 win 10 后停止引发它们

go - 以下实现是否使我的代码并行?

.net - Parallel.ForEach() - 多少个线程?