請遵守這個簡單的代碼:如何讓異常從異步方法傳播堆棧? (不能使用異步或等待關鍵字)
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