在被调用的函数或task.wait()上使用try / catch块?

时间:2012-08-14 11:04:37

标签: c# exception exception-handling task-parallel-library

使用try catch围绕某个任务调用的函数块和在task.wait()上调用try / catch之间的区别是什么。如果我处理函数中的异常,我仍然需要担心task.wait()可能发生的任何异常吗?

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()
{

}

2 个答案:

答案 0 :(得分:1)

使用您提供的第一个块,您将无法捕获可能发生的任何异常:

  
      
  • ObjectDisposedException:任务已经处理完毕。

  •   
  • ArgumentOutOfRangeException:timeout是-1毫秒以外的负数,表示无限超时 - 或 - 超时大于MaxValue。

  •   
  • AggregateException:任务被取消 - 或者 - 在执行任务期间抛出了异常。

  •   

来自Task.Wait() documentation on MSDN

答案 1 :(得分: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();