【问题标题】:Exception in Task任务异常
【发布时间】:2014-07-09 12:23:51
【问题描述】:

我必须在一个函数中执行两个任务,每个任务都有 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;
       }
    }

【问题讨论】:

  • 如果你同步等待任务完成,为什么要首先使用任务?为什么不直接调用Dojob1()Dojob2()?通常,为了处理错误,您可以向任务添加延续并检查这些延续中任务的状态(包括任何抛出的异常)。这是一个异步设置,你并没有真正使用它。
  • 任务中未处理的异常不再关闭应用程序(自 .Net 4.5 起)
  • @大卫。感谢您的回复。上面的代码只是原始问题的概述。我想知道上面代码的结果。
  • @I3arnon 谢谢你的意见。但我用的是 4。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的意见。
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 2012-10-26
  • 2012-12-09
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
相关资源
最近更新 更多