请遵守这个简单的代码:如何让异常从异步方法传播堆栈? (不能使用异步或等待关键字)
try
{
var t = Task.Factory.StartNew<bool>(() => { throw new Exception("aaa"); });
t.ContinueWith(_ => {}, TaskContinuationOptions.OnlyOnRanToCompletion).Wait();
}
catch (Exception exc)
{
Debug.WriteLine(exc);
}
我假设,如果t
有关联的异常,那么这个异常会被重新抛出的是Wait()
。然而,只有延续成功的存在似乎改变了这种行为。抛出什么是一个“任务被取消”的例外。
事实上,就Wait()
之前链接一个TaskContinuationOptions.NotOnRanToCompletion
完成处理表明,传递给它的任务不是故障,而是取消:
t.ContinueWith(_ => { }, TaskContinuationOptions.OnlyOnRanToCompletion)
.ContinueWith(t2 => Debug.Assert(t2.IsCanceled), TaskContinuationOptions.NotOnRanToCompletion)
.Wait();
这是所有有点怪。这意味着,我不能只链接我的快乐路径完成处理程序,让任何异常只是传播到等待线程的最终会合。
我在这里错过了什么?
注意
我仅限于.NET 4.0,所以没有await
和async
关键字。
如果你不知道,你可以使用异步的.NET 4.0/AWAIT http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl -async-is-now-stable.aspx –
@zespri:非常好! –
有趣。以下是一篇指导性文章:http://blogs.msdn.com/b/bclteam/archive/2012/10/22/using-async-await-without-net-framework-4-5.aspx – StriplingWarrior