2014-07-09 129 views
1

我必須在一個函數內部有兩個任務,每個都有Try Catch來處理異常。 但是我想知道會發生什麼,如果我在第一個任務中有異常時從函數返回,第二個也會以Exception結束。 第二個任務的異常處理未處理並且在GC上通過該任務對象調用Finalize時會使應用程序崩潰。任務異常

示例代碼:

public void ProcessJob() 
    { 
     var Job1 = Task.Factory.StartNew(() => Dojob1()); 
     var Job2 = Task.Factory.StartNew(() => Dojob2()); 

     try 
     { 
      Job1.Wait(); 
     } 
     catch(Exception ex) 
     { 
      //Handle Exception 
      return; 
     } 

     //some other actions. 


     try 
     { 
      Job2.Wait(); 
     } 
     catch(Exception ex) 
     { 
      //Handle Exception 
      return; 
     } 
    } 
+1

如果您同步等待任務完成,爲什麼首先使用任務?爲什麼不直接調用'Dojob1()'和'Dojob2()'?一般來說,爲了處理錯誤,您可以將任務的延續添加到任務中,並檢查這些延續中任務的狀態(包括任何拋出的異常)。這是一個異步設置,你並沒有真正使用它。 – David

+0

任務中未處理的異常不再拆除應用程序(自.Net 4.5) – i3arnon

+0

@David。感謝回覆。上面的代碼只是原始問題的概要。我很想知道上面代碼的結果。 –

回答

2

如果你觀察作業2的可能的異常,這將調用你提到的TPL未處理的錯誤行爲之前離開此功能。爲什麼不呢?您的代碼所具有的結構對於TPL而言是未知的。 TPL無法神奇地改變其行爲以迴應你如何編寫你的方法。

從.NET 4.5開始,未處理的異常不再使進程崩潰。不過,不要忽視它們。異常可以指出錯誤。

也許你可以通過使用Parallel.InvokeTask.WaitAll來簡化你的代碼。當然,這會延遲方法的返回,直到所有任務都完成,即使Job1失敗。

有一種方法可以忽略由Job2引起的異常,但忽略錯誤不是一個好的選擇。至少他們應該被記錄下來。

+0

感謝您的意見。 –