任务中的例外情况

时间:2014-07-09 12:23:52

标签: c# parallel-processing task-parallel-library task

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

示例代码:

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;
       }
    }

1 个答案:

答案 0 :(得分:2)

如果在观察Job2的潜在异常之前离开函数,这将调用您提到的TPL未处理错误行为。为什么不呢?您的代码所具有的结构对于TPL是未知的。 TPL无法根据您编写方法的方式神奇地改变其行为。

从.NET 4.5开始,未处理的异常不再使进程崩溃。不过,不要忽视它们。例外可能表示错误。

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

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