【问题标题】:A Task's exception(s) were not observed未观察到任务的异常
【发布时间】:2016-11-25 15:43:43
【问题描述】:

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

等待任务也没有观察到任务的异常 或访问其 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;

    }





}

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

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

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

堆栈跟踪:

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)

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

【问题讨论】:

  • 对我来说没有任何问题。尝试发布您的堆栈跟踪。
  • @JonathanAllen 已更新,感谢您的关注...
  • 该死,我没有看到任何有用的东西。我想你必须尝试附加一个调试器并希望有什么东西能触发它。
  • 好的,谢谢... 是否建议将我附加到生产环境?
  • 如果它似乎可以正常工作,则不会。附加到生产环境是最后的手段,因为您最终会关闭服务器。

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


【解决方案1】:

可能没有错。听起来 AppInsights 有点偏执。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-11-26
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2012-02-29
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多