任务异常
本文关键字:异常 任务 | 更新日期: 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.Invoke
或Task.WaitAll
来简化代码。当然,这将延迟方法的返回,直到所有任务都完成,即使在Job1失败的情况下。
有一种方法可以忽略由Job2引起的异常,但是忽略错误并不是一个好的选择。至少他们应该被记录下来。