【问题标题】:Use try/catch block on called functions or task.wait()?在被调用函数或 task.wait() 上使用 try/catch 块?
【发布时间】:2012-08-14 11:04:36
【问题描述】:

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

}

【问题讨论】:

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


    【解决方案1】:

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

    • ObjectDisposedException:任务已被释放。

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

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

    来自Task.Wait() documentation on MSDN

    【讨论】:

    • :O,一直都在,MSDN 浏览起来很烦。谢谢!
    【解决方案2】:

    我用来处理带有延续的任务中的异常,更容易 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();
    

    【讨论】:

      猜你喜欢
      • 2014-10-10
      • 2022-12-13
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2010-09-24
      • 1970-01-01
      • 2010-12-15
      相关资源
      最近更新 更多