请注意这个简单的代码:
try
{
var t = Task.Factory.StartNew<bool>(() => { throw new Exception("aaa"); });
t.ContinueWith(_ => {}, TaskContinuationOptions.OnlyOnRanToCompletion).Wait();
}
catch (Exception exc)
{
Debug.WriteLine(exc);
}
我假设如果t
有一个与之关联的异常,那么这个异常将被重新抛出Wait()
。然而,成功只有延续的存在似乎改变了这种行为。相反,抛出的是“任务被取消”异常。
实际上,TaskContinuationOptions.NotOnRanToCompletion
在之前链接完成处理程序Wait()
表明传递给它的任务没有出错,而是被取消:
t.ContinueWith(_ => { }, TaskContinuationOptions.OnlyOnRanToCompletion)
.ContinueWith(t2 => Debug.Assert(t2.IsCanceled), TaskContinuationOptions.NotOnRanToCompletion)
.Wait();
这一切都有些奇怪。这意味着,我不能仅仅链接我的快乐路径完成处理程序,让任何异常都传播到等待线程的最终集合点。
我在这里想念什么?
笔记
我仅限于 .NET 4.0,所以没有await
和async
关键字。