c# - 未观察到任务的异常

标签 c# asp.net exception asp.net-mvc-5 task

我在我的 Application Insight Web 应用程序日志中看到一个错误,但我没有找到它的来源,也没有在我的应用程序或 Web API(带有 Web API 2.0 的 .NET 4.5)中发现任何奇怪的行为,使用 OutputCache 和 Web Api 2 Cache,Azure 中的 MongoDB 就像具有 2 个实例的 Web 应用程序):

A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread.Object reference not set to an instance of an object.

我找不到错误的来源,我将向您展示一些示例代码,我使用了很多我的 Web Api 和 Javascript 来获取数据:

示例 Controller :

public Task<IActionResult> GetDataFromMyMongoDB(string id){

         var data = await _service.GetData(id);

         if(data == null)
               return BadRequest("Error");

         return Ok(data);
}

服务:

public Task<ICollection<MyDto>> GetData(id)
{
    //Check security operations for example, or business login like this:

    var data = await _repositoryData.Where(d=>d.Id == id);

    //For example, sometimes I do some business logic operations in which
    // I use try ... catch (this code is just for show example code)

    try
    {
       var dataToJson = JSON.parse(data);

       //Dummy code dataJson to obtain a value of this and changed and update
       //to repository

       //** Code omited **//

       var bool = await _repository.UpdateManyAsync(data);

       if(bool == false)
         return null;

       else 
         {
            //Here I do typical mapper operations from my
            //entities to my DTOs 

            //** Code omited **//

            return mappedListDto; // <-- Type: ICollection<MyDto>
         }  

    }
    catch(Exception ex)
    {
       //Log in Elmah
       //Elmah stuff code here

       //** Code omited **//

       return null;

    }





}

我的存储库是用于进行简单操作的标准代码,并且在单元测试中运行良好,我已经多次使用我的网络应用程序并且同时有超过 100 个用户没有问题,但是在我的日志中,我有异常的任务。

我读过这个questionthis one也是,但我不明白如何在我的代码中应用,我觉得很愚蠢。

编辑:更多信息:我在过去 12 小时内收到了大约 500 个此类异常,但应用程序运行正常,在过去 12 小时内我收到了大约 167 K 请求。

堆栈跟踪:

System.AggregateException:
System.NullReferenceException:
   at System.Web.ThreadContext.AssociateWithCurrentThread (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication.OnThreadEnterPrivate (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.HttpApplication.System.Web.Util.ISyncContext.Enter (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Web.Util.SynchronizationHelper.SafeWrapCallback (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
   at System.Threading.Tasks.Task.Execute (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)

有什么想法吗?我对此感到非常疯狂...非常感谢!

最佳答案

应该没什么问题。听起来 AppInsights 有点偏执。

这通常是由以下两种情况之一引起的。

一个是代码中“等待任何”类型的逻辑分支。这通常是一些使用 Task.WhenAny 的代码。我建议在您的代码中搜索“WhenAny”。

另一种是“即发即忘”的逻辑。这通常是调用 Task.Run 然后忽略返回任务的代码。编译器非常擅长就“即发即弃”代码向您发出警告(因为它几乎总是一个错误),因此首先要检查的是您的编译器警告。

因为你有一个单元测试套件,你可以为 TaskScheduler.UnobservedTaskException 连接一个处理程序,它将捕获这些异常,然后运行/调试你的测试套件并查看在哪些测试下得到打。如果您想停止 AppInsights,您可以在生产代码中添加一个调用 UnobservedTaskExceptionEventArgs.SetObserved 的处理程序。

关于c# - 未观察到任务的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38514552/

相关文章:

c# - 从捕获中排除异常类型的最佳方法是什么?

C# 内存损坏错误

c# - 无法将方法添加到要在 InitializeComponent 期间调用的 Windows 窗体

c# - 无法添加 Docker 支持 Visual Studio 2017

c# - 如何更改 C# 代码中的输入语言?

.net - 身份验证模式.Net

asp.net - 如何在我的 web.config.release 中转换这部分 webconfig?

c# - 安装vs2017后无法打开vs2015 .net core 1.1项目

java - 从 Java 程序运行外部可执行文件

java - 为什么我的 Java 异常在 SwingWorker 中抛出时不打印堆栈跟踪?