任务异常

本文关键字:异常 任务 | 更新日期: 2023-09-27 18:12:13

我必须在一个函数内的两个任务,每个都有Try Catch来处理异常。但我想知道会发生什么,如果我从函数返回时,在第一个任务中有异常,第二个也以异常结束。当GC在Task对象上调用Finalize时,第二个Task的异常是否未得到处理并使应用程序崩溃?

示例代码:

public void ProcessJob()
    {
        var Job1 = Task.Factory.StartNew(() => Dojob1());
        var Job2 = Task.Factory.StartNew(() => Dojob2());
        try
        {
            Job1.Wait();
        }
        catch(Exception ex)
        {
          //Handle Exception
          return;
        }
        //some other actions.

       try
       {
          Job2.Wait();
       }
       catch(Exception ex)
       {
          //Handle Exception
          return;
       }
    }

任务异常

如果在观察到Job2的潜在异常之前离开该函数,这将调用您提到的TPL未处理错误行为。为什么不呢?代码的结构对于TPL来说是未知的。TPL不能神奇地改变它的行为来响应你如何编写你的方法。

从。net 4.5开始,未处理的异常不再使进程崩溃。不过,不要忽视它们。异常可以指示bug。

也许你可以通过使用Parallel.InvokeTask.WaitAll来简化代码。当然,这将延迟方法的返回,直到所有任务都完成,即使在Job1失败的情况下。

有一种方法可以忽略由Job2引起的异常,但是忽略错误并不是一个好的选择。至少他们应该被记录下来。