【工作中遇到的问题】Dictionary 在进行Add操作使报超出了数组界限的问题

问题代码的主要功能是用于记录页面的执行时间的:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Web.Mvc;
 6 using TCWireless.Utility;
 7 using System.Threading;
 8 using TCBase.EagleEye.Metric;
 9
10 namespace TCWireless.Controller.BaseController
11 {
12     public class TimeFilter : ActionFilterAttribute
13     {
14         public string Name { get; set; }
15         //创建字典来记录开始时间,key是访问的线程Id.
16         private readonly Dictionary<int, DateTime> _start = new Dictionary<int, DateTime>();
17         public override void OnActionExecuting(ActionExecutingContext filterContext)
18         {
19             //过滤掉ChildAction, 因为ChildAction实际上不是一个单独的页面
20             if (filterContext.IsChildAction) return;
21             var currentThreadId = Thread.CurrentThread.ManagedThreadId;
22             try
23             {
24                 if (!_start.ContainsKey(currentThreadId))
25                 {
26                         _start.Add(currentThreadId, DateTime.Now);
27                 }
28             }
29             catch (Exception ex)
30             {
31                 LogWrapper.AddInfo("MobileHotel", "TimeFilter", "OnActionExecuting", ex);
32             }
33         }
34         public override void OnResultExecuted(ResultExecutedContext filterContext)
35         {
36             var currentThreadId = Thread.CurrentThread.ManagedThreadId;
37             if (!_start.ContainsKey(currentThreadId)) return;
38             try
39             {
40                 //计算出当前页面访问耗时
41                 var costSeconds = (DateTime.Now - _start[currentThreadId]).TotalMilliseconds;
42                 int value = Convert.ToInt32(costSeconds);
43                 MetricClient.Instance.LogTiming(Name, value);
44             }
45             catch (Exception ex)
46             {
47                 LogWrapper.AddInfo("MobileHotel", "TimeFilter", "OnResultExecuted", ex);
48             }
49             finally
50             {
51                     _start.Remove(currentThreadId);
52             }
53         }
54     }
55 }

问题出现在第26行.

然后百度发现其他人也有发现此类问题,原因是dictionnary是多线程不安全的.需要加上锁

时间: 2024-10-19 01:28:42

【工作中遇到的问题】Dictionary 在进行Add操作使报超出了数组界限的问题的相关文章

Linux 运维工作中的经典应用ansible(批量管理)

一 Ansible自动化运维工具 Python 在运维工作中的经典应用 ansible(批量管理操作) 1.安装ansible(需要bese epel 2种源) wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum

转://工作中 Oracle 常用数据字典集锦

DBA工作中数据字典就等同于我们本和笔,时时刻刻也分不开的,不管是看状态,还是监控,都需要数据字典的支持,本文整理出来常用的数据字典系列,帮助大家来记住和汇总以便查询利用 ALL_CATALOG All tables, views, synonyms, sequences accessible to the user  ALL_COL_COMMENTS Comments on columns of accessible tables and views  ALL_COL_GRANTS_MADE 

[工作中的设计模式]享元模式模式FlyWeight

一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 享元模式:主要为了在创建对象时,对共有对象以缓存的方式进行保存,对外部对象进行单独创建 模式要点: 1.享元模式中的对象分为两部分:共性部分和个性化部分,共性部分就是每个对象都一致的或者多个对象可以共享的部分,个性化部分指差异比较大,每个类均不同的部分 2.共性部分的抽象就是此模

openstack运维手册(个人实际工作中整理)

openstack运维手册,是本人在实际工作中整理的,现分享!!!因水平有限,欢迎广大朋友指正.具体文档见附件.

软件测试工程师工作中常用的Linux命令

Linux系统有着众多的优点,比方开源.非商业版本免费.多任务多用户操作,因而Linux系统在非桌面范畴占有压倒性的市场份额.关于互联网技术工作者来说,控制常用的Linux命令也是一门必修课.下面罗列一些笔者在工作中常用的Linux命令. cd 切换目录 cd .. 返回上一层目录 cd . 进入当前目录 cd - 返回前一次的目录,即上一次的目录不是上一层目录 ls 查看文件与目录 用法: ls [参数][文件] 参数: ls –l 显示文件的权限和属性 ls –a 列出所有的文件,包含隐藏文

[工作中的设计模式]解释器模式模式Interpreter

一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我很少附上类图,但解释器模式确实比较抽象,为了便于理解还是放了上来,此模式的要点是: 1.客户端提供一个文本.表达式或者其他,约定解析格式 2.针对文本中可以分为终结符表达式和非终结符表达式, 3.终结符表达式无需进一步解析,但仍需要转化为抽象接口的实例 4.针对非终结表达式,没一种标示需要定义一种解

[工作中的设计模式]策略模式stategy

一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口,执行同样的行为,为可以替代的 3.算法调用者唯一,算法调用者可以灵活改变自己需要调用的算法,从而实现计算. 二.模式代码 算法接口: /** * 算法统一接口,所有算法继承此接口 * @author zjl * @time 2016-1-24 * */ public interface IStra

工作中请注意的十点

第一:不要认为停留在心灵的舒适区域内是可以原谅的. 每 个人都有一个舒适区域,在这个区域内是很自我的,不愿意被打扰,不愿意被push,不愿意和陌生的面孔交谈,不愿意被人指责,不愿意按照规定的时限做事, 不愿意主动的去关心别人,不愿意去思考别人还有什么没有想到.这在学生时代是很容易被理解的,有时候这样的同学还跟“冷酷”“个性”这些字眼沾边,算作是褒义.然而相反,在工作之后,你要极力改变这一现状.否则,你会很快变成鸡尾酒会上唯一没有人理睬的对象,或是很快因为压力而内分泌失调.但是,如果你能 很快打破

工作中的感悟 (三)三个月碎碎念篇

感慨一下来这里工作已经有一个月了,从最初的不是很适应这里的节奏,到慢慢适应了这里的生活,中间的过程就像经过一场暴风雨的洗礼虽然说的有点夸张,但是也是差不多吧,同在学校比要累很多,不过坚信不管再累.也要坚持既然有人有干,那我们就可以干我们没有什么理由坚持不了.别人可以做到的我们一样可以做到. 刚来的时候以一种无所谓.既兴奋又有很多好奇的心态来到了北京,这里很多人梦想的地方,不禁感慨以后我也在北京这里开始了这里的生活,时间长了究竟会是怎样一种心境呢,据说这里压力大.这里消费高.这里租房忒别烦人,来到