我们说我有一个ASP.NET WebApi项目。
在我的HomeController中调用其中一个动作后,我在后台启动新任务,并立即返回响应。它看起来像这样:
public ActionResult Test(int id)
{
Task.Run(() => .... someMethod);
return new SomeViewModel();
}
正如你所看到的,我不等待完成任务,它的完全背景工作。
在我的global.asax中捕获项目中所有未处理的异常。但是当我在Task.Run中调用someMethod引发异常时,ASP中的Application_error事件没有捕获它。为什么?如何在后台任务中正确处理所有异常?
答案 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