记一次EF Core DBContext在Action委托中GC异常的问题.
今天在开发过程中发现.在SaveChanges的时候偶尔会抛出异常: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.
异常说得很明显,通过依赖注入的DBContext上下文已经被其他地方Dispose了.所以无法再次Dispose.


代码逻辑很简单,就是发送邮件后,调用委托通知tracking发送成功.然后保存到数据库.
按理说这段代码没问题,但就是报错了.
一开始以为是哪里没有await,所以导致task开的新线程没有被等待,从而导致提前gc.但代码就这么多,都检查过了没有遗漏的地方.排除
后来怀疑是DBContext的生命周期问题,但DBcontext是ServiceLifetime.Scoped. 同一个request中是单例的.排除
后来经过和同事交流,在代码结尾处加入Task.CompletedTask.等待所有线程结束.

神奇的事情发生了,完美运行.不报错了.
那这样的话,就问题就只可能是定义的Action<int> rollBack委托的问题了.

猛然发现,尽管我在代码中确实加入了async/await关键字

但是这里的异步等待,只是异步等待委托内部的操作.并不等待Action委托本身.也就是说,当我们执行委托里的方法时.开辟了一个新的线程去执行_dbContext.SaveChangesAsync()的方法.但是并没有等待它完成.
这时候主线程会立即执行下一步,也就是返回结果给Controller层. Return Ok()给前端.这个时候DBContex立刻就会调用Dispose.等到委托的方法调用完毕再次Dispose的时候.自然而然的就会抛出异常啦.因为他之前已经被Dispose了.
所有解决办法很简单
方法一 在代码结尾加入await Task.CompletedTask 等待所有线程都结束.再返回.
方法二 讲Action<int> 换成 Func<int,Task> 并在调用委托前 await
经过这次问题,还是暴露出不少问题.
1:对async/await 还是有认识不足的地方.基础知识不扎实,导致了对委托的错误使用.
2:对自己的代码太过自信.没有做完整的测试.事实上 这里的代码我都没测试过就上了DEV环境.认为很简单不会出问题的.做事还是太浮躁.
所以写一篇博客,用以自省
记一次EF Core DBContext在Action委托中GC异常的问题.的更多相关文章
- EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型
官方教程:https://docs.microsoft.com/en-us/aspnet/core/data/?view=aspnetcore-2.1 使用EF CodeFirst在MySql中创建新 ...
- [翻译 EF Core in Action 2.2] 创建应用程序的数据库上下文
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- EF Core in Action 中文翻译 第一部分导航
Entityframework Core in action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core ...
- [翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 2.0] 查询数据库
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.8] MyFirstEfCoreApp应用程序设置
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.7] MyFirstEfCoreApp访问的数据库
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译] EF Core in Action 关于这本书
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
随机推荐
- FJUT - OJ优先队列专题题解
题目链接http://120.78.128.11/Contest.jsp?cid=18 题面不贴了 都是英文题,看的我心力憔悴 =7= 一.Ugly Numbers 题目说一个数的质因数只包含2.3或 ...
- SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)
准备工作 环境准备 JAVA版本 java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121 ...
- [Leetcode] 第307题 区域和检索-数组可修改
参考博客:(LeetCode 307) Range Sum Query - Mutable(Segment Tree) 一.题目描述 给定一个整数数组 nums,求出数组从索引 i 到 j (i ...
- MySQL中对字段内容为Null的处理
使用如下指令,意思就是 select IFNULL(jxjy,0) AS jxjy from yourTable ifnull(a,b) 意思是指:如果字段a为null,就等于b if( sex = ...
- 快速入门和使用HTML–使用Django建立你的第一个网站
一 前记 你每天浏览的网页,通过网络看的新闻,看着淘宝京东的绚丽多彩的界面.是否想过这个问题,它是怎么实现的呢?有没有搜过相关的知识呢?假如没有,假如你是一位对事物好奇的主或者是做计算机相关东西的人. ...
- 环境搭建-CentOS集群搭建
环境搭建-CentOS集群搭建 写在前面 最近有许多小伙伴问我,大数据的hadoop分布式集群该如何去搭建.所以,想着,就写一篇博客,帮助到更多刚入门大数据的人.本博客会一步一步带你实现一个Hadoo ...
- 心动吗?正大光明的免费使用IntelliJ IDEA商业版
IntelliJ IDEA是广受Java开发者喜爱的工具,其商业版的价格十分昂贵,如下图: 现在有机会免费获取IntelliJ IDEA的正版License,您是否心动呢?我把自己成功申请Licens ...
- Spring 梳理 - javaConfig在App和webApp中的应用
package com.dxz.demo.configuration; import org.springframework.context.annotation.Configuration; @Co ...
- 对vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制
一.定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图 ...
- C语言I博客作业
|这个作业属于哪个课程 | C语言程序设计I | | ---- | ---- | |对这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/SE2019-2 ...