2

在某个任务调用的功能块周围使用 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()
{

}
4

2 回答 2

1

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

  • ObjectDisposedException: 任务已处理。

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

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

来自Task.Wait()MSDN 上的文档

于 2012-08-14T11:17:42.953 回答
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();
于 2012-08-14T15:17:03.263 回答