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. ubuntu下创建定时任务的两种方式及常见问题解决方案

    创建定时任务的目的就是摆脱人为对程序重复性地运行. 0. 首先用下面的指令检查你是否安装crontab, crontab -l 如果本身就有的话,那么出现如下指令 LC_CTYPE="zh_ ...

  2. 环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的JVM信息

    关于环境: 本文中的实战都是在docker容器中进行的,容器的出处请参照<在docker上编译openjdk8>一文,里面详细的说明了如何构造镜像和启动容器. 在上一篇文章<修改,编 ...

  3. C++ STL vector的学习

    vector就是一个不定长数组,vector是动态数组,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素,使用vector之前,必须包含相应的头文件和命名空间. #include <vec ...

  4. mysql 查询参数尾部有空格时被忽略

    最近再使用mysql时,无意见发现,当我查询参数尾部输入若干个空格时,依然可以查出和不加空格相同的结果,像这样 select * from wa where name='be ' 等同于 select ...

  5. 5分钟了解lucene全文索引

    一.Lucene介绍及应用 Apache Lucene是当下最为流行的开源全文检索工具包,基于JAVA语言编写. 目前基于此工具包开源的搜索引擎,成熟且广为人知的有Solr和Elasticsearch ...

  6. pycharm中报ImportError: libcublas.so.9.0错误的解决方法。

    前些天不知为啥cuda不能用了,nvidia-smi也没反应.然后我就重新装了一下cuda.后来使用pycharm远程连接时,居然报错了. ImportError: libcublas.so.9.0: ...

  7. vue -- vue-cli webpack项目打包后自动压缩成zip文件

    用vue2.0开发项目,使用npm run build 命令 ,但是只会生成dist文件夹,以下是生成zip压缩包方法 1,插件安装 webpack插件安装 filemanager-webpack-p ...

  8. nested exception is java.lang.NoClassDefFoundError: javax/xml/soap/SOAPElement

    JavaSE 8 includes package java.xml.soap.JavaSE 9 moved package javax.xml.soap to the module java.xml ...

  9. JAVA设计模式-动态代理(Proxy)源码分析

    在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...

  10. (七十四)c#Winform自定义控件-金字塔图表

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...