Cannot access a disposed object in ASP.NET Core
Cannot access a disposed object in ASP.NET Core楠木大叔???? 导航
??对于.neter来说,在使用ASP.NET Core的过程中,大家或多或少会遇到这样的报错——“Cannot access a disposed object”。出现这样的异常的原因有很多,如果它在调试的时候出现是很容易解决的,但是有些时候它在本地运行良好,等到你部署到生产环境才会表现出来。针对这个异常,请跟随我一起来分析和探究其根本原因。 ??在ASP.NET Core开发中,我多次碰见了这样的报错,并且跟踪这个bug很艰难。这样的报错有多种原因。有时仅凭其表现的“症状”就能修复这个Bug,但是有时候又极其痛苦。通过寻找“病因”,我们可以反过来优化自己的代码。 ??错误信息很清楚:
常见原因对象已经释放(The object is disposed in your code) ??最简单的原因是你有一个可以释放的对象,然后你在代码的某个地方释放了它。也可能是你释放了一个使用了该对象的对象。当你试图访问一个被释放的对象时,就引发了该异常。此时,你要做的就是查看该范围的代码路径,或者上下文调用关系,通过打断点来排查该问题。 代码异步执行(Some code is running async) ??我遇到的另外一种原因是你在新线程中执行了某段逻辑。依赖的框架释放了对象,并将该对象返回给主线程。 Task.Run( () => { // or ThreadPool.QueueUserWorkItem(async _ => { using (var context = **create your new context here,handle it directly or let the DI framework do its magic**){ foreach(var user in Users){ email.Send(user.email); context.....; context.SaveChanges(); } } }); ??在APS.NET Core Web API 中,我们可以用Swashbuckle.AspNetCore 和 NSwag这两个包来实现Swagger,而且二者都是github上开源的。此外,nswag还提供了生成typescript客户端代码的方法以及用于API的服务代码。 使用async void 而非 async Task ??另一种原因可能是你在本应该使用使用async Task的地方使用了async void。潜在的异步代码会在你的线程返回之后执行。就像在代码中启动一个新线程一样,它可能会意外地正确运行。在这种情况下,您可能只在release版本中看到错误。当您不知道在哪里查找时,这可能很难调试。PS:笔者恰好遭遇该情况,我和我的小伙伴花费了一天时间来找这个bug。 ?? 错误的写法: public async void FailtyMethod(){ ?? 正确的写法: public async Task CorrectMethod(){ 总结??解决这些bug,有时候会令人沮丧,甚至抓狂。我曾今和我的另外两个小伙伴花费了一天时间来找这个bug。最后大家都黔驴技穷。 ??我希望这篇文章能够帮助到你。 参考
关注 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – Asp.net 5(vnext)是否可以使用?
- asp.net – IIS上的远程调试 – 访问被拒绝的梦魇!
- Asp.Net Zero轻量级审核流设计
- ASP.NET Identity外部认证提供程序自定义图标
- asp.net-web-api – 在Bot框架中自动部署(Bot LUIS QnA表存
- asp.net – 即使在ssl上,在ViewState中存储信用卡和定价信息
- asp.net – 为每个网站/应用程序创建单独的IIS应用程序池的
- asp.net – 在webapi中实现PATCH
- asp.net – MySQL ::连接器/净欧元符号
- asp.net – MVP模式和会话值
- asp.net-web-api – 如何设置Elmah与ASP.NET Web
- 在ASP.NET 3.5中实现异常处理
- asp.net – 我没有选择母版页的选项
- asp.net – 不能在aspx页面的部分使用Response.W
- 如果DataSource不包含任何项目,如何在ASP.NET C#
- asp.net-mvc – 实现IModelBinder的最佳实践
- asp.net-core – 在JsonPatchDocument中使用.Net
- asp.net-mvc – 如何测试MVC3 razor布局中是否存
- asp.net-mvc-4 – 如何实现自定义SiteMapNodePro
- 将ASP.NET MVC4应用程序部署到GoDaddy编译器问题