前言

.Net Core WebApi Redis消息订阅_菜鸟Coco的博客-CSDN博客

后续

好不容易处理好后台任务,结果会时不时报错:

A second operation started on this context before a previous asynchronous operation completed.Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe.

百度了一圈,说把Startup.cs中AddDbContext 的生命周期改为Transient,改了之后:

还是报类似的错误,

An attempt was made to use the context while it is being configured. A DbContext instance cannot be used inside OnConfiguring since it is still being configured at this point. This can happen if a second operation is started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

大致意思是  在配置上下文时尝试使用上下文。 DbContext 实例不能在 OnConfiguring 中使用,因为此时它仍在配置中。 如果在前一个操作完成之前对此上下文启动了第二个操作,则可能会发生这种情况。 不保证任何实例成员都是线程安全的。

也就是说,DbContext 不是线程安全的,在 DbContext 执行 AcceptAllChanges 之前,会检测实体状态的改变,所以,SaveChanges 会和当前上下文一一对应,如果是同步方法,所有的操作都是等待,这是没有什么问题的,但试想一下,如果是异步多线程,当一个线程创建 DbContext 对象,然后进行一些实体状态修改,在还没有 AcceptAllChanges 执行之前,另一个线程也进行了同样的操作,虽然第一个线程可以 SaveChanges 成功,但是第二个线程肯定会报错,因为实体状态已经被另外一个线程中的 DbContext 应用了。具体看下面链接中大佬的分析,

EntityFramework DbContext 线程安全 - 田园里的蟋蟀 - 博客园

因为我这个业务功能已经走到这儿了,没办法,只能想办法解决,最后只能来硬的了,加锁!!

我是需要异步处理redis收到的订阅消息并存储到数据库,所以就在消息处理方法中加了锁,部分代码如下:

 public async Task DoWork(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){//等待10s执行某个任务await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);//Thread.Sleep(30000);_helper.Unsubscribe(ChannelTest);//订阅通道,处理收到的消息await _helper.SubscribeAsync(ChannelTest, (channel, msg) => HandMsg(channel, msg));}}object lockObj = new object();public void HandMsg(string channel, string msg){lock (lockObj){_logger.LogInformation("收到订阅数据:" + msg);MeterReadResult readResult = JsonConvert.DeserializeObject<MeterReadResult>(msg);// 自己的消息处理逻辑,使用DbContext操作数据库保存数据}
}

加锁之后,经测试,可以正常走流程没报错,问题暂时得到解决。

EF Core DbContext 线程安全相关推荐

  1. 浅析 EF Core 5 中的 DbContextFactory

    EF Core 5 中的 DbContextFactory Intro 使用过 EF Core 大多都会遇到这样一个场景,希望能够并行查询,但是如果使用同一个 DbContext 实例进行并行操作的时 ...

  2. EF Core上下文DbContext相关配置和生命周期

    一. 配置相关 1. 数据库连接字符串的写法 (1).账号密码:Server=localhost;Database=EFDB01;User ID=sa;Password=123456; (2).win ...

  3. ABP Vnext 4.4:统一Ef Core的DbContext/移除EF Core Migrations项目

    Abp vnext 4.4出现了一个比较重大的变更:在Startup template中移除了EF Core Migrations项目,本文翻译自community.abp.io/articl 由于本 ...

  4. EF Core 2.0中Transaction事务会对DbContext底层创建和关闭数据库连接的行为有所影响...

    数据库 我们先在SQL Server数据库中建立一个Book表: CREATE TABLE [dbo].[Book]([ID] [int] IDENTITY(1,1) NOT NULL,[BookNa ...

  5. 配置EF Core的DbContext

    配置创建的 DbContext 这篇文章演示用于配置基本模式DbContext通过DbContextOptions连接到使用特定的 EF Core提供程序和可选行为的数据库. 设计时 DbContex ...

  6. EF Core之DBContext生命周期

    EF Core之DBContext生命周期 DBContext是EF Core的核心,.Net Core WebApi开发的时候,绝大多数的场景下,我们只需要一个Scoped的DBContext即可, ...

  7. 用ASP.NET Core MVC 和 EF Core 构建Web应用 (一)

    系统必备 .NET Core 2.0.0 SDK 或更高版本. 已安装 ASP.NET 和 Web 开发工作负载的 Visual Studio 2017 15.3 版或更高版本. 创建Web应用程序 ...

  8. 国产化之路-统信UOS /Nginx /Asp.Net Core+ EF Core 3.1/达梦DM8实现简单增删改查操作

    引言 经过前期的准备工作,.net core 3.1的运行环境和WEB服务器已经搭建完毕,这里需要注意一下,达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官 ...

  9. EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题

    小故事 在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此) 小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性,知道他发工资的日子,也 ...

最新文章

  1. 【算法】Tween算法
  2. hdu 1255(线段树+离散化)
  3. 硬件——STM32 , 录音
  4. solaris安装java_Solaris是出色的Java开发平台的原因
  5. Linux系统编程之进程控制(进程创建,fork函数,进程中止,进程等待,程序替换)
  6. AR9331中Linux内核启动中与IRQ中断相关的文件
  7. 深度学习(7) - 长短时记忆网络(LSTM)
  8. 移动通信发展史及原理学习
  9. 利用vue.js实现一个砍价小程序
  10. 小米硬盘路由器服务器,随手分享攻略 篇九:小米路由器更换10T硬盘 —— 小白教程...
  11. 新手gxf学python---万年历
  12. cdr2020永久序列号及试用过期解决
  13. Zotero取消英文语法检查
  14. c语言分解质因数法求最大公约数,最大公约数求法大全
  15. VUE常用问题hack修改
  16. 从今以后我一个人唱悲伤情歌:伤感的QQ空间日志
  17. Spark入门(五)——Spark Streaming
  18. php自动生成后门代码,PHP小后门代码
  19. CWE-416: Use After Free(释放后使用)
  20. Linux设备驱动-platform虚拟总线dya02

热门文章

  1. 我们需要什么样的游戏
  2. MFC联合HAlcon双相机单帧采集图片
  3. Oracle 时间处理
  4. 葬花吟 林黛玉 清 曹雪芹
  5. python显示图片透明度怎么调,如何使jpg图像半透明?
  6. “回车”(Carriage Return)和“换行”(Line Feed)
  7. oracle月份去掉0,Oracle取月份,不带前面的0
  8. Tornado 异步协程coroutine原理
  9. 软件工程习题,耦合性的概念如何与软件可移植性相关联?举例支持你的论述,应用逐步求精法为下列程序开发三种不同级别的过程抽象
  10. 智商情商哪个重要_情商与智商哪个更重要