EntityFramework中的线程安全,又是Dictionary
继上次记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)后又再次与Dictionary博弈,这一次是在EntityFramework中的Dictionary。
从一个异常说起
这个异常与上次的异常有着同一个特性:间歇性,碰到类似的异常在信心上就被削弱了一大半。。。
在第一次看到这个异常的时候觉得解决它非常的简单,无非就是在字典操作的地方加个锁,但仔细看了一会发现这个问题并没有那么简单,可以看到这个异常的最后几个堆栈信息来自System.Data.Entity命名空间,也就是EntityFramework,这就使问题变得难以寻纠。
出错的地方就在FirstOrDefault,一个在简单不过的Linq方法。
反编译查看EntityFramework的实现
AddNewRelation方法的内容如下:
马上锁定了AddRelationshipEntryToDictionary,方法代码如下:
可以看出是EntityFramework添加状态监控相关的逻辑,看到这也大概猜出来了又是线程安全的问题,但为了确定我追纠了调用AddNewRelation的HandleRelationshipSpan方法。
代码比较复杂,较难看懂,于是就去EntityFramework源码托管的站上面去看看是否有写注释,碰碰运气。
果不其然还是存在比较详尽的注释
问题也大致清晰了,应该是线程共享的DbContext出现了问题。
用Demo还原异常
解决方案
因为我们并不想放弃线程内共享一个DbContext的方案,所以我们并没有从根本解决这个问题,我们把调用FirstOrDefault的操作放在了Lazy里面。
剩下的就是观察效果。
写在最后
写了两篇解决BUG的纪要不为了大家能快速解决问题,而为了交流一种寻找BUG解决BUG的思路与方法。
最后,福州地区有需要找工作或者想换工作的“猿”吗?如果有可以沟通沟通联系联系呗。
EntityFramework中的线程安全,又是Dictionary的更多相关文章
- 浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
采用VSTO或者Shared Add-in等技术开发Excel插件,其实是在与Excel提供的API在打交道,Excel本身的组件大多数都是COM组件,也就是说通过Excel PIA来与COM进行交互 ...
- C#中的线程(三) 使用多线程
第三部分:使用多线程 1. 单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留 ...
- Java5中的线程池实例讲解
Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易,灵活.本文通过一个网络服务器模型,来实践Java5的多线程 ...
- C#中的线程(下)-多线程
1. 单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留下的模型,但很多时候它 ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
- Linux中epoll+线程池实现高并发
服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指“I/O线程”,即负责I/O操作,协调分配任务的“管理线程”,而实际的请求和任务通常交由所谓“工作者线程”处理.通常多线程模型下,每个线程 ...
- “线程安全的” Dictionary(TKey,TValue)
这是一篇翻译,专门介绍Dictionary线程安全问题,原文网址如下 http://www.grumpydev.com/2010/02/25/thread-safe-dictionarytkeytva ...
- C#中的线程(三)多线程
C#中的线程(三)多线程 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator ...
- c++11中的线程、锁和条件变量
void func(int i, double d, const string& s) { cout << i << ", " << d ...
随机推荐
- 深度学习笔记------linux下配置安装caffe-cpu only模式
本文适合初学者学习配置caffe的最简单方法.这是我在看了网上各种大神的方法后总结的最傻瓜式的配置方法了. 本人也是在不断地配置caffe过程中受打击与成长@.@ 第一步.配置caffe所需的依赖环境 ...
- SQL中case语句的两种方式
- SDRAM总结
使用的流程 W9825G6JH winbond sdram 4M words X 4banks X 16bits=. Accesses to the SDRAM are burst oriented. ...
- selenium如何分别启动IE、firefox、chrome浏览器
1.火狐浏览器 /* * 初始化火狐浏览器 * */ public static WebDriver initFireFox(WebDriver dr) { String key = "we ...
- Eclipse 中的重构功能
Eclipse 中的重构功能使其成为了一个现代的 Java 集成开发环境 (IDE),而不再是一个普通的文本编辑器.使用重构,您可以轻松更改您的代码,而不必担心对别处造成破坏.有了重构,您可以只关注于 ...
- 2014 Super Training #6 A Alice and Bob --SG函数
原题: ZOJ 3666 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3666 博弈问题. 题意:给你1~N个位置,N是最 ...
- LoadRunner 11 完整卸载
实现彻底删除LR的步骤 打开任务管理器,关闭所有LR相关的进程 请备份好所有LR脚本 进入控制面板-添加与删除,找到HP LoadRunner并点击删除按钮,若出现提示“shared DLLs”消息框 ...
- Android 属性动画(Property Animation) 完全解析 (上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提 供了几种动画类型:View Anima ...
- 18SpringMvc_在业务控制方法中收集数组参数
这篇文章我们要解决的问题的多选框选中,并批量删除. 比如:
- C语言 日常小结
1.当数组当作函数参数的时候会退化为指针 #include<stdio.h> #include<stdlib.h> void sort(int a[]){ int num = ...