2012-03-28 22 views
8

我有一個關於.NET任務並行庫的錯誤處理的問題。 AggregateException在哪些情況下會持有多於一個內部異常?我知道這可以發生在前。當調用Task.WaitAll(anArrayOfTasks)時,有2個或更多任務正在引發異常,但是還有其他情況(即,如果只等待1個任務完成,您會獲得多於1個內部異常)是否可能?什麼時候AggregateException包含多於一個內部異常?

+0

與Parallel Library無關。假設你有一個方法來刪除文件列表,但有一些被鎖定。您可以使用'AggregateException'爲鎖定的文件重新拋出並繼續刪除其餘文件。 – nalply 2013-09-19 08:39:07

回答

4

任務可以引發一個聚合異常,它本質上可以包含多個內部異常。這意味着在處理任務時,應始終考慮具有多個內部異常的聚合異常。即使你沒有使用Task.WaitAll,你正在等待的任務可能會在內部等待多個子任務。或者,您等待的任務可能會返回多個異常。你根本無法知道作爲一個來電者。

+0

我同意在一般情況下,你應該假設你可能會得到一個異常列表並設計你的錯誤處理,我只想知道,如果處理一個不依賴於其他異步任務的單獨異步任務將創建一種情況是超過1個例外被通過。 – scripni 2012-03-28 06:42:38

+0

可能,只是可能。雖然這不太可能。如果內部任務等待多個孩子的任務。將創建一個新的AggregateException,其中包含1個包含多個(可能聚合!)內部異常的AggregateException。因此,爲了獲得所有異常並將它們作爲集合來處理它們,總是優先調用AggregateException的Flatten方法 – Polity 2012-03-28 06:44:59

+0

在這種情況下,如何將錯誤傳遞到UI?通常情況下,如果執行某項操作,則可能有兩個結果,即成功或錯誤。設計一個隱式處理錯誤列表的UI在我的看法中似乎令人困惑,並且有兩種情況(一種錯誤,一種錯誤多種)似乎過分複雜。我一直在考慮在UI中最多處理一個異常,並記錄所有異常(並向用戶顯示一條消息以檢查錯誤日誌)。 – scripni 2012-03-28 06:50:27

5

如果您有一個「父」任務和一個或多個附加到父級的「子」任務,可能會發生這種情況。這意味着只有當所有子任務完成時,父任務纔會完成,並且子任務的異常也會傳播到父任務。

舉個例子,下面的代碼:

var task = Task.Factory.StartNew(
    () => 
    { 
     Task.Factory.StartNew(
      () => { throw new Exception("inner"); }, 
      TaskCreationOptions.AttachedToParent); 

     throw new Exception("outer"); 
    }); 

如果Wait()這項任務,它thows的AggregateException,看起來像這樣:

  • AggregateException
    • Exception:外
    • AggregateException
      • Exception:內

如果你不喜歡它可以包含內部AggregateException小號AggregateException S,你可以使用the Flatten() method。還有另一種方法可用於處理AggregateException s:Handle()

+0

感謝您的回答,提到Handle()方法的+1,我不知道這一點。 – scripni 2012-03-28 08:25:33

相關問題