如何在后台任务中正确处理异常?

时间:2018-01-27 18:14:42

标签: c# asp.net .net task task-parallel-library

我们说我有一个ASP.NET WebApi项目。

在我的HomeController中调用其中一个动作后,我在后台启动新任务,并立即返回响应。它看起来像这样:

public ActionResult Test(int id)
{
    Task.Run(() => .... someMethod);

    return new SomeViewModel();
}

正如你所看到的,我不等待完成任务,它的完全背景工作。

在我的global.asax中捕获项目中所有未处理的异常。但是当我在Task.Run中调用someMethod引发异常时,ASP中的Application_error事件没有捕获它。为什么?如何在后台任务中正确处理所有异常?

1 个答案:

答案 0 :(得分:0)

根据此reference,您可以通过查询任务的Exception属性来检查任务中的异常。以下是从参考资料中提取的代码:

using System;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      var task1 = Task.Run( () => { throw new CustomException("This exception is expected!"); } );

      while(! task1.IsCompleted) {}

      if (task1.Status == TaskStatus.Faulted) {
          foreach (var e in task1.Exception.InnerExceptions) {
              // Handle the custom exception.
              if (e is CustomException) {
                  Console.WriteLine(e.Message);
              }
              // Rethrow any other exception.
              else {
                  throw e;
              }
          }
      }
   }
}

public class CustomException : Exception
{
   public CustomException(String message) : base(message)
   {}
}
// The example displays the following output:
//        This exception is expected!

请注意,保存任务的变量的范围足够持久,因此可以查询其Exception属性。您的示例有一个隐式本地保存任务,当执行返回时,该任务将超出范围。

- ss