我在我的 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 个用户没有问题,但是在我的日志中,我有异常的任务。
我读过这个question和 this 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/