2010-04-16 35 views
4

我看TPL異常處理例如從MSDN @MSDN處理來自TPL的異常的示例 - 這是一個競爭條件嗎?

http://msdn.microsoft.com/en-us/library/dd537614(v=VS.100).aspx

代碼的基本形式是:

Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); }); 
try 
{ 
    task1.Wait(); 
} 
catch (AggregateException ae) 
{ 
    throw ae.Flatten(); 
} 

我的問題是:這是一個競爭條件?如果task1在try執行之前拋出會發生什麼?我是否錯過了阻止這場比賽的事情?

它不應該被寫成這樣:

try 
{ 
    Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); }); 
    task1.Wait(); 
} 
catch (AggregateException ae) 
{ 
    throw ae.Flatten(); 
} 

回答

6

沒有,第一個例子是完全有效的。

當任務中引發異常時,它將被包裝在一個AggregateException中。只有當另一個線程加入任務時,在本例中才通過調用task1.Wait()是傳遞給加入線程的異常。本質上,這個異常是「存儲」的,直到它可以傳播回等待反饋的線程。