侧边栏壁纸
博主头像
Komi博主等级

WizMan Komi

  • 累计撰写 30 篇文章
  • 累计创建 43 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

.Net中在多线程情况下DbContext无法直接被单例引用的问题

Komi
2022-06-27 / 0 评论 / 0 点赞 / 63 阅读 / 1,259 字
温馨提示:
内容仅供参考,实际使用需根据自身条件进行调整与删改

起因

自己在处理一批Excel内容上传的功能时使用Parallel并行处理Excel读取行
线程处理后再由DataContext(继承自DbContext)来保存状态,却发现会报Disposed的异常,如下:

---> (Inner Exception #6) System.ObjectDisposedException: 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: 'DataContext'.
   at Microsoft.EntityFrameworkCore.DbContext.CheckDisposed()
   at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
   at Microsoft.EntityFrameworkCore.DbContext.get_ChangeTracker()

开始着手解决

之后经过查阅MSDN上的资料发现DbContext本身是不支持在单例的情况下由多个线程进行操作的 如下是文档中的引用

Warning EF Core does not support multiple parallel operations being run on the same context instance. You should always wait for an operation to complete before beginning the next operation. This is typically done by using the await keyword on each asynchronous operation.

这里文档中写的是在Parallel这样的多线程操作的情况下必须在其中一个线程已完成的情况下再去使用这个DbContext,这里推荐使用的是await关键字在每个异步操作中

屏幕截图 2022-06-28 063604.png

这里我们需要自己去在控制器类中自动注入一个DbContextOptions的类,而类的泛型需要是我们自己定义的继承自DbContext的上下文类(DataContext),这里我的写法是:

屏幕截图 2022-06-28 063744.png

之后就可以在每多一个线程的情况下自己去自动创建一个DataContext

屏幕截图 2022-06-28 063814.png

0

评论区