2013-05-01 55 views
3

我使用asyncawait以及在我的應用程序Task.Factory.StartNew但有一兩件事,我發現改變的是,Visual Studio是沒有當未處理的異常出現TPL歇上未處理的異常

這裏更多的斷裂是我的意思before using await enter image description here

,但我把一個方法爲Task和使用後等待

enter image description here

它只能在Visual Studio中的輸出區域捕獲...

BTW:這對我來說是很奇怪的,因爲我是新來的.Net4.5請原諒我,如果失敗了,說明我需要什麼特別,但再次我想知道什麼是

  • 使用 異步時,我怎麼可能做出例外的Visual Studio休息等待

回答

5

當調試器說「異常是由用戶代碼未處理的」,這意味着什麼是一個例外已經傳播到框架2 RK。由於async Task方法在其返回的Task上設置了例外,因此該異常不會傳播到框架。像這樣的例外是未觀測到

如果您希望調試程序在例外情況發生時打破,請使用Debugger - > Exceptions - >檢查CLR Exceptions的「Thrown」框。

如果你想觀察的異常,那麼change from TaskFactory.StartNew to Task.Run,並呼籲恢復TaskWait。這將通過Main傳播異常(包裝在AggregateException中),直至框架。

0

這就是爲什麼void返回async方法是邪惡的。

在第一種情況下,異常沒有被捕獲,調試器正在提醒你。

第二種情況將出現在結果任務上。

如果處理方法內部的異常,您將看到類似的行爲。

Task.Run是TaskFactory.StartNew的簡化版本:Task.Run vs Task.Factory.StartNew