我在函数内部有两个任务,每个都有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;
}
}
答案 0 :(得分:2)
如果在观察Job2的潜在异常之前离开函数,这将调用您提到的TPL未处理错误行为。为什么不呢?您的代码所具有的结构对于TPL是未知的。 TPL无法根据您编写方法的方式神奇地改变其行为。
从.NET 4.5开始,未处理的异常不再使进程崩溃。不过,不要忽视它们。例外可能表示错误。
也许您可以使用Parallel.Invoke
或Task.WaitAll
来简化代码。当然,即使在Job1失败的情况下,这也会延迟方法的返回,直到所有任务都完成。
有一种方法可以忽略Job2引起的异常,但忽略错误不是一个好方法。至少他们应该被记录下来。