如果計算限制的任務拋出未處理的異常,該異常會被“吞噬”並存儲到一個集合中,而線程池線程可以返回到線程池中。調用Wait方法或者Result屬性時,這些成員會拋出一個System.AggregateException對象。
如果一直不調用Wait或Result,或者一直不查詢Task的Exception屬性,代碼就一直注意不到這個異常的發生。為能夠發現沒有注意到的異常,可以向TaskScheduler的靜態UnobservedTaskException事件登記一個回調方法,每當一個Task被垃圾回收時,如果存在一個沒有被注意到的異常,CLR的終結器線程就會引發這個事件,並且向事件處理方法傳遞一個UnobservedTaskExceptionEventArgs對象,該對象包含AggregateException。
當線程調用Wait方法時,系統檢查線程要等待的Task是否已經開始執行。如果是,調用Wait的線程會被阻塞,直到Task運行結束為止。但如果Task還沒有開始執行,系統可能(取決於TaskScheduler)使用調用Wait的線程來執行Task。在這種情況下調用Wait的線程不會被阻塞,它會執行Task並立即返回。好處在於沒有線程會被阻塞,所以減少了對資源的占用(因為不需要再創建一個線程來替代被阻塞的線程),並提升了性能(因為不需要花時間來創建線程,也就沒有上下文切換)。不好的地方在於,假如線程在調用Wait前已經獲得了一個線程同步鎖,而Task試圖獲取同一個鎖,就會造成死鎖的線程。