我有一些简单的代码作为repro:
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块中抛出了一个意外的TaskCanceledException(它在AggregateException InnerExceptions对象中)。 “任务被取消了。”
为什么我会收到此异常?任务的Continuation永远不会触发,它没有生成异常,但在等待时仍然会得到聚合异常....
我希望有人可以解释这对我有什么意义:)
答案 0 :(得分:55)
你没有等待带有一个OnlyOnFaulted延续的任务 - 你正在等待 on 那个继续(由ContinueWith
返回)。延续永远不会触发,因为原始任务正常返回,所以它就像被取消一样。
对我有意义。
我怀疑你想要创建任务,添加延续,然后等待原始任务:
var taskTest = Task.Factory.StartNew(() =>
{
System.Threading.Thread.Sleep(5000);
});
taskTest.ContinueWith((Task t) =>
{
Console.WriteLine("ERR");
}, TaskContinuationOptions.OnlyOnFaulted);