Cannot access a disposed object in ASP.NET Core

楠木大叔    

导航

  • 常见原因
  • 总结

  对于.neter来说,在使用ASP.NET Core的过程中,大家或多或少会遇到这样的报错——“Cannot access a disposed object”。出现这样的异常的原因有很多,如果它在调试的时候出现是很容易解决的,但是有些时候它在本地运行良好,等到你部署到生产环境才会表现出来。针对这个异常,请跟随我一起来分析和探究其根本原因。

  在ASP.NET Core开发中,我多次碰见了这样的报错,并且跟踪这个bug很艰难。这样的报错有多种原因。有时仅凭其表现的“症状”就能修复这个Bug,但是有时候又极其痛苦。通过寻找“病因”,我们可以反过来优化自己的代码。

  错误信息很清楚:

Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.

Object name: 'XXXContext'.

常见原因

对象已经释放(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.AspNetCoreNSwag这两个包来实现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。最后大家都黔驴技穷。

  我希望这篇文章能够帮助到你。

参考

关注

  请关注微信公众号智客坊

Cannot access a disposed object in ASP.NET Core的更多相关文章

  1. asp.net Core HttpClient 出现Cannot access a disposed object. Object name: 'SocketsHttpHandler' 的问题。

    ASP.NET Core 部署在Centos 中 偶尔出现 One or more errors occurred. (Cannot access a disposed object.Object n ...

  2. Xamarin.Forms bug? System.ObjectDisposedException: Cannot access a disposed object

    Hi, My Android Xamarin.Forms application uses a Navigation stack to display various views, I often h ...

  3. System.Net.Sockets.Socket SendAsync System.ObjectDisposedException: Cannot access a disposed object.

    发生未处理的域异常! System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net ...

  4. abp Cannot access a disposed object. A common cause of this error is disposing

    框架:abp 异常信息: An unhandled exception was thrown by the application.System.ObjectDisposedException: Ca ...

  5. # - net - cannot access a disposed object r nobject name filebufferingreadstream

    .Net Core 2.1-Cannot access a disposed object.Object name: 'IServiceProvider' (3) I just migrated .N ...

  6. ASP.NET Core 问题排查:Request.EnableRewind 后第一次读取不到 Request.Body

    实际应用场景是将用户上传的文件依次保存到阿里云 OSS 与腾讯云 COS ,实现方式是在启用 Request.EnableRewind() 的情况下通过 Request.Body 读取流,并依次通过 ...

  7. ASP.NET Core 新建线程中使用依赖注入的问题

    问题来自博问的一个提问 .net core 多线程数据保存的时候DbContext被释放 . TCPService 通过构造函数注入了 ContentService , ContentService ...

  8. 解决ASP.NET Core在Task中使用IServiceProvider的问题

    前言 问题的起因是在帮同事解决遇到的一个问题,他的本意是在EF Core中为了解决避免多个线程使用同一个DbContext实例的问题.但是由于对Microsoft.Extensions.Depende ...

  9. asp.net core mvc 在中间件中使用依赖注入问题:System.InvalidOperationException: Cannot resolve scoped service 'IXXXService' from root provider.

    今天在弄JWT的时候需要用到用户验证使用一个自己写好的验证,但在出现了:System.InvalidOperationException: Cannot resolve scoped service ...

随机推荐

  1. codeforces H. Queries for Number of Palindromes(区间dp)

    题目链接:http://codeforces.com/contest/245/problem/H 题意:给出一个字符串还有q个查询,输出每次查询区间内回文串的个数.例如aba->(aba,a,b ...

  2. .Net基础篇_学习笔记_第六天_异常捕获复习及断点调试

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. Redis常用命令(Set、Hash、Zset)

    1.Set(单值多value) 1. sadd.smembers key . > SADD set01 (integer) > SMEMBERS set01 ) " ) &quo ...

  4. d010:盈数、亏数和完全数

    题目: 对一个正整数N而言,将它除了本身以外所有的因子加起来的总和为S,如果S>N,则N为盈数,如果S<N,则N为亏数,而如果S=N,则N为完全数(Perfect Number).例如10 ...

  5. solr java代码

    添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  6. 02 (OC)* ViewController 的声明周期

    一. UIViewController 的 生命周期 代码 示例 #pragma mark --- life circle // 非storyBoard(xib或非xib)都走这个方法 - (inst ...

  7. App引流增长技术:Deeplink(深度链接)技术

    移动互联网时代,信息的分享传播无疑是 App 引流增长的关键,与其花费大量精力和成本找渠道.硬推广,不如从细节下手,用最快最简便的方法实现 Deeplink(深度链接)技术,打破信息孤岛.缩短分享路径 ...

  8. NPOI导出数值格式设置(我是保留四位小数,不足补0)

    看了网上好多帖子,都是保留两位小数的,写法是: HSSFDataFormat.GetBuiltinFormat("0.00"); 于是想四位小数,就是多加两个00,变成: HSSF ...

  9. 如何使用WordPress搭建个人博客

    目录 如何使用WordPress搭建个人博客 一.在安装Linux服务器管理工具WDCP面板 二.在WDCP面板创建一个站点 二.上传博客程序到服务器 @(如何使用WordPress搭建个人博客) 如 ...

  10. 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式

    目录 一. 方案1:ThreeBSP.js或ThreeCSG.js扩展库 二. 方案2:平面镂空模型拉伸 三. 方案3:Cinema 4D建模后输出模型文件 示例代码托管在:http://www.gi ...