一个任务的异常没有被观察到。

5
我正在监视应用洞察 Web 应用程序中的日志错误,但我找不到它来自哪里,也找不到我的应用程序或 Web API(.NET 4.5 和 Web API 2.0,使用 OutputCache 和 Web Api 2 Cache,MongoDB 在 Azure 中作为 Web 应用程序有 2 个实例)中的任何奇怪行为:

任务的异常未被等待任务或访问其 Exception 属性观察。因此,未观察到的异常由终结器线程重新引发。对象引用未设置为对象的实例。

我找不到错误来自哪里,我将向您展示一些示例代码,我正在使用我的 Web API 和 Javascript 大量获取数据:

示例控制器:

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;

    }





}

我的代码库是用于进行简单操作的标准代码,在单元测试中运行良好。我已经多次使用我的Web应用程序,同时有100多个用户使用,没有问题。但是在我的日志中,我有一个任务的异常。
我已经阅读了这个问题这个,但是我不知道如何应用到我的代码中,感觉很愚蠢。
编辑:更多信息:在过去的12小时内,我已经得到了大约500个这种类型的异常,但应用程序运行良好,在过去的12小时内,我有大约167K请求。
堆栈跟踪:
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)

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


1
我觉得没有什么问题。尝试发布你的堆栈跟踪。 - Jonathan Allen
@JonathanAllen 已更新,感谢您的关注... - chemitaxis
好的,谢谢...建议将我连接到生产环境吗? - chemitaxis
不要因为看起来工作正常就随意附加到生产环境中。将其附加到生产环境是最后的选择,因为最终会导致服务器崩溃。 - Jonathan Allen
我也遇到了这个问题。昨晚进行了一夜的模拟测试。 - Youngjae
显示剩余2条评论
1个回答

5

可能没有什么问题。听起来像是AppInsights有点过于谨慎了。

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

另一个原因是“启动并忘记”类型的逻辑。这通常是调用Task.Run然后忽略返回的任务的代码。编译器非常善于警告您有关启动并忘记代码的问题(因为它几乎总是错误的),因此首先要检查的是编译器警告。

由于您拥有单元测试套件,因此可以钩住TaskScheduler.UnobservedTaskException的处理程序,该处理程序将捕获这些异常,然后运行/调试测试套件,并查看哪些测试会出现此问题。如果您想安静下AppInsights,则可以在生产代码中添加一个处理程序,该处理程序调用UnobservedTaskExceptionEventArgs.SetObserved


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接