C# 任务中的异常

C# 任务中的异常,c#,parallel-processing,task-parallel-library,task,C#,Parallel Processing,Task Parallel Library,Task,我必须在一个函数中完成两个任务,每个任务都有Try-Catch来处理异常。 但是我想知道当第一个任务中出现异常,第二个任务也以异常结束时,如果我从函数返回,会发生什么。 当GC对该任务对象调用Finalize时,第二个任务的异常是否会未经处理并使应用程序崩溃 示例代码: public void ProcessJob() { var Job1 = Task.Factory.StartNew(() => Dojob1()); var Job2 = Tas

我必须在一个函数中完成两个任务,每个任务都有Try-Catch来处理异常。 但是我想知道当第一个任务中出现异常,第二个任务也以异常结束时,如果我从函数返回,会发生什么。 当GC对该任务对象调用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;
       }
    }

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

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

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


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

如果您同步等待任务完成,为什么要首先使用任务?为什么不直接调用
Dojob1()
Dojob2()
?通常,为了处理错误,您可以向任务添加延续,并检查这些延续中任务的状态(包括任何抛出的异常)。这是针对异步设置的,您并没有真正使用它。任务中未处理的异常不再破坏应用程序(从.Net 4.5开始)@David。谢谢你的答复。上面的代码只是原始问题的概要。我想知道上面代码的结果。@I3arnon谢谢你的观点。但是我用的是4。谢谢你的输入。