.net core 并发下的线程安全问题

2023-10-26

抱歉,其实内容并不如题!!!

背景(写测试demo所出现的异常,供大家学习与拍砖):

.net core webapi项目,做了一个授权的filter(真正的生产项目的话,JWT很棒),单个接口测试没有问题,当用前端在同一个页面调用多个接口的时候,运行服务,打开页面,然后……Exceptions……(真正的开发中大家应该也会遇到)

异常1: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.

异常2:A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

异常3:Invalid attempt to call Read when reader is closed.

异常4:Unable to cast object of type 'System.Data.ProviderBase.DbConnectionClosedConnecting' to type 'System.Data.SqlClient.SqlInternalConnectionTds'.

异常5:Object reference not set to an instance of an object.

异常6:不允许启动新事务,因为有其他线程正在该会话中运行。

异常7:An error occurred while updating the entries. See the inner exception for details.

尝试运行了N多遍,嗯,挺不稳定的(代码垃圾!),那看看异常吧

一看很容易理解:在前一个操作完成之前,在此上下文中启动第二个操作。任何实例成员都不能保证是线程安全的。就是说,我在用这个上下文的时候,你来抢个屁……

这个可能发生在并发的情况下,同时使用了同一个上下文……那么打开一个页面,为什么会同时使用同一个上下文呢?好吧,在这里要负荆请罪了(可以说是自己的问题)

我在Filter里面有查询,用到数据库上下文<DbContext> 。罪过咯,直接想在Filter里面过滤黑名单,所以查了数据库(这个业务是不合理的,这是一个作死的行为,请谨慎看待,这里做学习讨论之用)。

public class AuthFilterAttribute : ActionFilterAttribute
{

public override void OnActionExecuting(ActionExecutingContext context)
{

base.OnActionExecuting(context);

.....

//判断是否在黑名单内
var blackList = _app.GetBlackList();
......
}
}

这里为什么用 ActionFilterAttribute ?是因为测试的时候要监测一下接口运行的整个过程,So……

然后还有一些错是:对象引用未设置为对象的实例。这个错误太常见,不就是对象为Null了吗?但是,未实例化对象在业务逻辑上的情况太多了。我的应该有:

1、没有获取到当前对象,这是.net core,不是.net,不是因为没有new对象。是注入中没有注入成功,获取注入后,没有获取到。(但我本来运行的好好的,是因为一下是打开对接的页面才发生的问题,可以排除了)

2、本来已经实例的对象被回收了……(这可能性嘛……有一定的可能,但发生在哪呢?)

找啊找,其实方向有了,但是自己却没想起来……

其实如果不确定的话,倒是可以先找找别人是怎么说的(不是为了装X,找开发上的问题我是推荐 github 和 stackoverflow 的,大部分的问题都可以找到):

(1)异常 1 还有同样 一条搜索结果

 640?wx_fmt=png

640?wx_fmt=png

(2)异常 2

 640?wx_fmt=png

虽然以上找的不一定是真正的答案,至少提供了一个方向,并且你至少可以尝试性地去解决一下。这里提供的方向其实很明确:

1、是否应该使用 Scoped 和 Transient 的,你却使用了 Singleton;

2、多线程中使用了 async 却没有配对的使用 await;

至少我找到的关键点是这两个。

那怎么找到并解决这个问题呢,.net core都是注入的,当然 AuthFilterAttribute 也是注入的。跑到 Startup一看,很明显,问题出在哪里了 -- 单例!本应该是Scoped模式的,却用了单例。

那就将 AuthFilterAttribute 换一种注入模式就行啦。

 640?wx_fmt=png

改为

 640?wx_fmt=png

我使用的是Filter,Filter有自己的生命周期,去确认一下:Filter的官方文档

看到一张图!!!(当然你也可以细细研读一下这个文档)如下:

640?wx_fmt=png

这还不明显?!!!

Filter会被回收的!!!这同样解释了 异常3、4、5、6、7所发生的原因。

OK,问题已经解决了,这是在开发中遇到的问题,可以说是涉及到.net core 本身的运行机制。

我算是一个应用型的程序员,喜欢在应用中学习底层的东西。那么接下来当然就可以扩展 Singleton、Scoped 和 Transient 等知识了。 

如不喜,请拍!

原文地址:https://www.cnblogs.com/Vam8023/p/10656777.html

 
 

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net core 并发下的线程安全问题 的相关文章

  • 进程、线程相关基础理论总结

    进程 线程相关基础理论 一 进程与线程的区别 1 进程是指一个程序在计算机中的一次运行 它是资源分配的最小单位 2 线程是进程中调度执行的最小单位 3 进程有独立的内存空间 线程没有独立的内存空间 它必须运行在进程中 4 线程之间通信更方便
  • Runnable可以实现资源共享但Thread不能实现资源共享的原因

    转自 http blog csdn net javaniceyou article details 6859305 线程的两种实现方式 通过实现Runnable接口的线程方式可以实现资源的共享 而继承Thread则不可以 原因何在 先看下面
  • 华为OD2023(A卷)基础题37【工单调度策略】

    工单调度策略 题目描述 当小区通信设备上报警时 系统会自动生成待处理的工单 工单调度系统需要根据不同的策略 调度外线工程师 FME 上站去修复工单对应的问题 根据与运营商签订的合同 不同严重程度的工单被处理并修复的时长要求不同 这个要求被修
  • Android OpenGL 纹理绘制图像---Native实现

    本文纹理贴图的native实现 是指指定纹理的功能放在了native中实现 其他流程和Java实现类似 在这里就不赘述了 再回头看一下指定纹理数据的方法 void glTexImage2D GLenum target GLint level
  • 剑指 Offer 29. 顺时针打印矩阵

    顺时针打印矩阵 顺时针打印矩阵 思路 题解 JAVA判断二维数组是否空 左 下 右 上四条变上的循环 思路 参考视频 题解 注意边界条件 JAVA判断二维数组是否空 1 二维数组首地址是否为空 即array null 2 二维数组是否为 即
  • 命令行svn commit时注释实现换行

    svn ci m 11111 其中 111111 就是你填写的注释 如果你想换行写 也是可以的 只要你不写后面的那个引号 你可以写一行就回车一次 最后写完了 再加上后面的引号 然后再回车 就执行提交动作了 svn ci m 11111 gt
  • flutter简单的本地草稿箱功能

    需求1 发帖退出时提示是否保存草稿 需求2 每条草稿中可以保存多张图片 最多9张 或一条视频及三十来个其它参数 需求3 每条草稿都是可以被覆盖的 可以点击删除 需求4 草稿页面可以一键清空 需求5 草稿随app删除一起没掉 看到需求第一时间
  • 剑指 Offer 04. 二维数组中的查找

    题目链接 04 二维数组中的查找 思路分析 利用右上角的数来判断减少判断行数 如果右上角的数大于target那么该列都大于 所以j 如果小于target那么改行都小于 所以i class Solution public bool findN
  • MFC之模态非模态与自定义对话框16

    1 模态非模态对话框 由于我们这里使用按下菜单栏的选项弹出对话框 所以放在框架类中使用 注意 按下选项可以使用左键按下事件或者选项对应的处理事件 我们使用后者 这点需要区分好 1 先在菜单栏添加对话框的选项 2 在资源视图添加对话框 3 添
  • 语义分割的基本网络结构

    1 编码器 编码器通常可以理解为一些列对应的卷积模块 通常由卷积层 池化层以及BN层 卷积层负责获取图像特征 池化层对图像进行下采样并且将尺度不变特征传送到下一层 而BN主要对训练图像的分布归一化 加速学习 可以理解为编码器是用来进行特征提
  • BSC链节点搭建

    BSC 节点同步教程 准备步骤 安装go环境包 GO下载地址 https golang org doc install wget c https golang org dl go1 16 3 linux amd64 tar gz O sud
  • elasticjob启动报错KeeperErrorCode = OperationTimeout

    elasticjob报错 Caused by com dangdang ddframe job reg exception RegException org apache zookeeper KeeperException Operatio
  • 在学习DNS的过程中给我的启发

    在学习DNS的过程中给我的启发 在国内 关于DNS相关的话题一直络绎不绝 比如DNS根服务器为什么中国没有 还有Anycast BGP实现负载 为什么DNS只有13个 还有DNS over HTTPS 和 DNS over TLS的优劣等等
  • 使用SqlBulkCopy大批量导入数据

    实际的开发可能会遇到数据大批量插入数据的问题 若是一条条的循环倒数效率非常低下 这个较好的解决方案 1 2 protected void Button1 Click object sender EventArgs e 3 4 5 DateT
  • android 使用SurfaceFlinger 服务的流程分析,基于4.4(三)----图像的输出过程

    经过前面两篇的介绍 现在可以分析surfaceflinger 的处理UI buffer的流程了 目录 一 onMessageReceived 1 handleMessageTransaction 2 handleMessageInvalid
  • 百度飞桨(厦门)人工智能产业赋能中心签约,共创人工智能产业协同服务新生态...

    9月8日 第二十三届中国国际投资贸易洽谈会在厦门正式开幕 当日 厦门市思明区政府和火炬管委会 与百度正式签约 联手共建百度飞桨 厦门 人工智能产业赋能中心 思明区委书记林重阳 厦门市工信局副局长 大数据局长许文恭 厦门市科技局副局长黄颖 火
  • R手册(Tidy+Transform)--tidyr

    文章目录 Reshape Data Split or Unit Cells Handle Missing Values tidyr Easily tidy data with spread and gather functions Resh
  • 【Java八股文总结】之计算机网络

    文章目录 计算机网络 一 基础 1 网络体系结构 2 HTTP协议 TCP协议 UDP协议比较 3 网络协议 4 WebSocket和Socket的区别 5 常见的端口及其对应的服务 6 从浏览器输入URL到页面展示发生了什么 1 DNS域
  • 刀具补偿资料汇总

    问题描述 采用不同尺寸的刀具加工同一轮廓尺度的零件 为了编程方便和不改变已经制备好的穿孔带 所以数控装置常备有刀具补偿功能 刀具位置补偿 刀具1 刀尖B点为编程起点 刀具2 刀尖C点 备注 刀尖坐标值 Xb Zb C点坐标原点I C点坐标原
  • 苹果如何安装ipa

    懒省事使用爱思助手即可 1 下载cydiaimpactor 官方地址 百度云下载 https pan baidu com s 1rYIG4go fOEHarSjziA1eg 提取码 3b48 2 连上苹果手机 启动cydiaimpactor

随机推荐

  • 【TensorFlow 入门】1、函数基础

    文章目录 一 np random 1 np random RandomState 2 np random uniform 3 np random rand 4 np random RandomState 二 tf reduce 一 np r
  • 忘记宝塔面板安全入口?修改登录入口让你的服务器更加安全!

    宝塔面板新增加了安全入口登录方式 新安装的宝塔面板默认会随机生成一个8位字符的安全目录 阿里云百科网分享宝塔安全入口登录方式 安全入口修改方法及安全入口关闭的方法 什么是安全入口 原来的宝塔登录地址为 http 你的服务器ip 8888 这
  • Python代码实现“FlappyBird”小游戏

    开发工具 Python版本 3 6 4 相关模块 pygame模块 以及一些Python自带的模块 相关文件 关注公众号 Python学习指南 回复 FlappyBird 获取 环境搭建 安装Python并添加到环境变量 pip安装需要的相
  • SpringBoot admin 2.0 详解

    一 什么是Spring Boot Admin Spring Boot Admin是一个开源社区项目 用于管理和监控SpringBoot应用程序 应用程序作为Spring Boot Admin Client向为Spring Boot Admi
  • vue项目中使用echarts和china.js实现中国地图

    在echarts最新的5 4 0版本中 已不能直接引用china js来绘制中国地图 需要我们自己下载china js包 在网上查找资料 大部分是在index html文件中直接引入echarts和china js文件 但我使用这种方法在v
  • 平均池化和最大池化区别

    pooling的结果是使得特征减少 参数减少 但pooling的目的并不仅在于此 pooling目的是为了保持某种不变性 旋转 平移 伸缩等 常用的有mean pooling max pooling和Stochastic pooling三种
  • @RequestBody 500 的原因

    因为 RequestBody是调用目标类的无参构造器 若有有参构造就会报错 因此一般实用RequestBody的类 和 domain不同 应该重新配置一个包来存放此类 类 且之赋予他们get set方法
  • VTK教程1--------VTK在win10下的安装

    VTK的安装 本文在win10操作系统下 安装了VTK8 1 2 下文是安装顺序 事先准备三个软件 1 Visual Studio2017 community 该版本可以免费使用 2 CMake 本文使用的版本是cmake 3 13 1 w
  • XREAL 联合创始人吴克艰谈AR:下一代计算平台及其关键技术

    编者按 一种行业观点是 AR或是未来十年 三十年的革命性技术 是下一代计算平台 近半个世纪 我们总能听到苹果在AR行业的创新动作 开辟了新的硬件范式 AR VR行业为苹果不断欢呼的同时 激发了人们的好奇心 究竟 人类在戴上AR眼镜的那一瞬间
  • 【C++】内存分区&引用

    内存分区 首先我们要了解 内存区域大概分为四个区域 1 代码区 这里主要存放我们写的代码的二进表达式 即CPU可以看懂的机械指令 这个区域有两个特征 只读和共享 前者可以保证代码的不会被随意修改 后者可以保证相同代码多次阅读不需要创建多个副
  • linux-kali 2020.3.3 虚拟机 环境 下载安装

    一 所需环境配置文件下载 1 虚拟机 这次配置环境使用的vmware版本为15 5 0 虚拟机大家可以自行在相关微信公众号上搜索破解版 按照其上进行安装 如下图 如果需要也可以vm官方网站上进行下载相关软件 直接下载对应版本即可 vm官网链
  • python argument 1 must be 2-item sequence, not int

    在继续python学习的时候 发现报错了 出现错误argument 1 must be 2 item sequence not int 明明我是照着书打的 为什么会出现错误呢 import pygame import sys from se
  • 《软件测试》第十三章 软件安全测试

    软件测试 第十三章 软件安全测试 13 0 前言 13 1 战争游戏 电影 13 2 了解动机 13 3 威胁模式分析 13 4 软件安全是一项功能吗 软件漏洞是一个缺陷吗 13 5 了解缓冲区溢出 13 6 使用安全的字符串函数 13 7
  • Microsoft visual C++ 2013 redistributable (x86) setup failed

    Microsoft visual C 2013 redistributable x86 0x80070005 setup failed log 截图 下载SubInACL工具 链接 https blogs msdn microsoft co
  • css flex shrink,CSS3 flex-shrink属性用法详解

    下面本文章来给各位介绍一下CSS3 flex shrink使用方法 希望例子能帮助到各位 flex grow控制flex container有多余空间的时候怎么分配 默认值为0 即所有的flex items都不分配 flex shrink1
  • C#里面SQLite读取数据的操作

    挂载表格时候用 public static DataSet Query string SQLString using SQLiteConnection connection new SQLiteConnection connectionSt
  • BottomNavigationView+ViewPager实现页面滑动

    如图所示 在androidstudio中新建一个Bottom Navigation Activity 修改布局中的内容
  • import无法定位到输入点

    torch geometric安装 运行环境需要torch geometric 下载安装完之后 再 import torch geometric时 一直出错 安装不上 找了很多解决方法 终于找到可以解决的办法了 亲测有效 原因 最终发现因为
  • 最小重量机器设计问题

    相关问题 工作分配问题 设某一机器由n个部件组成 每一种部件都可以从m个不同的供应商处购得 设 wij 是从供应商j 处购得的部件i的重量 cij 是相应的价格 试设计一个回溯算法 给出总价格不超过d的最小重量机器设计 对于给定的机器部件重
  • .net core 并发下的线程安全问题

    抱歉 其实内容并不如题 背景 写测试demo所出现的异常 供大家学习与拍砖 net core webapi项目 做了一个授权的filter 真正的生产项目的话 JWT很棒 单个接口测试没有问题 当用前端在同一个页面调用多个接口的时候 运行服