关于多线程efcore dbcontext 的解决方案。
2024-08-30 10:37:38
- 首先我们大部分的efcore框架用的DbContext(或者封装的repo)都是底层注入的上下文容器实体。
- 然后Dbcontext不是线程安全的,也就是说,你在当前线程中,只能创建一个 DbContext 实例对象(特定情况下),并且这个对象并不能被共享。
- 当我们使用多线程去执行数据库的操作时就有可能造成各种问题。
- 我这里就在网站启动时去跑发布和订阅任务。
- 解决方案:使用using从ioc容器中创建新的dbcontext 。然后用完立即释放。这样就不会占用主线程的dbContext了。
/// <summary>
/// 执行未发布成功的信息
/// </summary>
public void ToBePublishs()
{
Console.WriteLine("开始执行未发布任务");
using (var _eventClientDbContext = (EventClientDbContext)ServiceProvider.CreateScope().ServiceProvider.GetService(typeof(EventClientDbContext)))
{
var PublishsList = _eventClientDbContext.Publishs.Where(a => a.PublishStatus == false).ToList();
List<Publishs> publishsList = PublishsList.ToList();
if (publishsList.Count > )
{
Console.WriteLine("开始执行未发布任务,本次任务执行条数为:" + publishsList.Count());
using (var tran = _eventClientDbContext.Database.BeginTransaction())
{
foreach (var PublishsInfo in publishsList)
{
//var Result = ClientPost(ClientType.Publishs, PublishsInfo);
var Result = string.Empty;
try
{
Result = ClientPost(ClientType.Publishs, PublishsInfo);
if (Result.Contains("Success"))
{
PublishsInfo.PublishStatus = true;
PublishsInfo.ModifyTime = DateTime.Now;
_eventClientDbContext.Publishs.Update(PublishsInfo);
_eventClientDbContext.SaveChanges();
}
}
catch (Exception ex)
{
Console.WriteLine("执行未发布成功的信息抛出异常:" + ex.StackTrace + ex.Message);
continue;
}
}
tran.Commit();
}
}
}
Console.WriteLine("未发布任务End");
}
最新文章
- json和jsonp的区别,ajax和jsonp的区别
- [置顶] Android 2016新技术
- Do带你解析:原生APP与web APP的区别
- SIP介绍
- JAVA学习中Swing部分JDialog对话框窗体的简单学习
- 未能加载文件或程序集“CefSharp, Version=1.25.XXXX”或它的某一个依赖项。试图加载格式不正确的程序。
- Qt之Concurrent框架
- bzoj1594
- 从问题看本质: 研究TCP close_wait的内幕
- Android-操作栏之选项菜单
- Spring MVC如何进行JSON数据的传输与接受
- Selenium 显示等待和隐式等待
- 爬取西刺ip代理池
- 对java泛型的理解
- vue 源码学习(一) 目录结构和构建过程简介
- django-form介绍
- C++学习(二十九)(C语言部分)之 顺序表
- iOS保存gif动态图
- 解题:USACO15JAN Grass Cownoisseur
- css中的display(显示)和visibility(可见性)
热门文章
- feign请求远程接口时报Caused by: java.net.UnknownHostException
- SP Flash Tool版本对应MTK处理器型号速查(SP Flash Tool Download)
- 【leetcode】1266. Minimum Time Visiting All Points
- java文件上传下载解决方案
- 运行时错误:“stack around the variable…was corrupted”
- 【杂题】[CodeForces 1172E] Nauuo and ODT【LCT】【口胡】
- 2-SAT (two-statisfiability) 算法 学习笔记
- HTML DOM的学习
- Python argparse 用法总结
- 剑指offer31----栈的压入、弹出序列