一项任务';未观察到s个异常

本文关键字:观察 异常 一项 任务 | 更新日期: 2023-09-27 17:58:11

我在Application Insight web应用程序的日志中看到一个错误,但我找不到它的来源,也没有在我的应用程序或web api中发现任何奇怪的行为(.NET 4.5和web api 2.0,使用OutputCache和web api 2 Cache,类似Azure的MongoDB 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)

有什么想法吗?我完全疯了。。。非常感谢!

一项任务';未观察到s个异常

可能没有什么问题。听起来AppInsights有点偏执。

这最常见的原因有两种。

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

另一种是一种"点燃并忘记"的逻辑。这通常是调用Task.Run然后忽略返回任务的代码。编译器非常善于警告您即发即弃代码(因为它几乎总是一个错误),所以首先要检查的是编译器警告。

由于您有一个单元测试套件,您可以为TaskScheduler.UnobservedTaskException挂接一个处理程序,该处理程序将捕获这些异常,然后运行/调试您的测试套件,查看在哪些测试下命中。如果您想让AppInsights安静下来,可以在生产代码中添加一个调用UnobservedTaskExceptionEventArgs.SetObserved的处理程序。