2012-08-14 28 views
2

使用圍繞某個任務調用的功能塊的try catch和task.wait()上的try/catch之間的區別。如果我處理函數中的異常,我是否仍然需要擔心task.wait()中可能出現的異常?在調用的函數或task.wait()上使用try/catch塊?

var factory = new TaskFactory(); 
task t1= factory.StartNew(() => funA(); 
t1.Wait(); 


void funcA() 
{ 
    try{..} 
    . 
    . 
    catch{..} 
} 

或者

var factory = new TaskFactory(); 
task t1= factory.StartNew(() => funA(); 
try 
{ 
    t1.Wait(); 
} 
catch{....} 

void funcA() 
{ 

} 

回答

1

與你只要你將無法捕捉這些異常可能出現的第一個塊:

  • ObjectDisposedException:任務已被處置。

  • ArgumentOutOfRangeException:timeout是-1毫秒以外的負數,表示無限超時 - 或 - 超時大於MaxValue。

  • AggregateException:任務被取消 - 或者 - 任務執行期間拋出異常。

Task.Wait() documentation on MSDN

+0

感謝svick,仍然習慣格式的SO! – 2012-08-14 11:33:02

+0

:哦,它一直在那裏,MSDN是如此煩人browse.thanks爲此! – user1514077 2012-08-15 07:51:42

0

我用它來處理與延續任務例外,更容易IMO:

Task myTask= Task.Factory.StartNew(...).ContinueWith(myTaskFinished=> 
{ 
    if (myTaskFinished.IsCompleted) 
    { 
     // Hooray 
    } 

    if (myTaskFinished.IsFaulted) 
    { 
     foreach (Exception ex in myTaskFinished.Exception.InnerExceptions) 
      //Exception handle.. 
    } 

    if(myTaskFinished.IsCanceled) 
    { 
     //Cancellation token? 
    } 
}); 

myTask.Wait();