簡體   English   中英

如何捕獲在ContinueContin部分中引發的異常?

[英]How to catch an Exception that has been thrown in the ContinueWith part of a task?

button_click事件上,我啟動一個Task來異步執行一些耗時的計算。 我使用Task.ContinueWith並將用於繼續執行的Task.ContinueWith設置為UI同步上下文,以在Textbox顯示異步計算的結果。

現在,讓我們說這最后一部分引發了如下異常:

private void button1_Click(object sender, EventArgs e)
{
   Task.Factory.StartNew(DoSomeCalculations).ContinueWith
      (t => { throw new Exception("Some Exception"); }, TaskScheduler.FromCurrentSynchronizationContext()); 
}

如果啟用調試選項“僅啟用我的代碼”,則程序將停止並收到警告:“用戶代碼未處理異常”

但是,如果我不設置此選項,則異常會在任何地方消失(沒有程序崩潰,什么也沒有)。

那么如何/在哪里可以處理此異常?

編輯:請注意,正如標簽所示,我使用的是.NET-4.0

如果要處理異常,則可以在延續本身內部有一個try / catch塊,以便它處理自己的異常,或者在延續中添加一個額外的延續以處理異常。

請注意,如果使用await而不是ContinueWith來添加延續,則通常會更簡單,尤其是在處理異常時,因為它將代表您添加延續。

如果您使用的是.NET Framework 4.5,則有一種處理Task對象的新方法。

private async void button1_Click(object sender, EventArgs e)
{
   await Task.Run(() =>
   {
       DoSomethingAsync()
   });
   //this line will run in UI thread
   throw new Exception("Some Exception");
}

並請注意,當您使用async關鍵字時,Task對象內部發生的任何異常都會被編譯器創建的狀態機吞沒。 但是此異常是在Task對象內部設置的,因此基本上您仍然可以使用Task對象引用該異常。

供您參考的內容: http : //blog.stephencleary.com/2012/02/async-and-await.html

根據最佳實踐,如果我們無法避免使用異步void方法(尤其是事件處理程序),則應在該方法中實現try catch。 但是您需要確保正在調用的所有異步方法都具有異步Task方法簽名,以便捕獲拋出的異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM