日期:2014-05-18  浏览次数:20512 次

做压力测试中碰到的奇怪问题
错误一 异常详细信息: System.ArgumentException: 已添加了具有相同键的项。
代码如下

行 102: if (!_EnumList.ContainsKey(keyName))
行 103: {
行 104: _EnumList.Add(keyName, list);
行 105: }
行 106: }
 
已经判断了 为什么还会出现

错误二 给定关键字不在字典中。 

 
行 65: dv.Sort = "Menu_Sort asc,Menu_ID ";
行 66: rptproduct.DataSource = dv;
行 67: rptproduct.DataBind();
行 68: } 
行 69: 
 
这个大部分时候是正常 ,500次中出现了3次这种错误 为什么会出现呢


------解决方案--------------------
典型的没考虑并发啊。加同步锁。

C# code
private static object _lockObj = new object();

...
lock(_lockObj)
{
   if (!_EnumList.ContainsKey(keyName))
   {
      _EnumList.Add(keyName, list);
   }
}

------解决方案--------------------
楼上正解。
如果没有做这个压力测试,LZ估计都不会发现这个问题,即使发现了,查代码也很难查出来。
------解决方案--------------------
lock (syncObj)
{
if (!_EnumList.ContainsKey(keyName))
{
lock(syncObj)
{
_EnumList.Add(keyName, list);
}
}
}

syncObj 需要static
------解决方案--------------------
object锁也不要用一次new一次,用一次new一次跟没锁一样。
错误2也是并发问题吧。
如果多线程公用一个Dictionary,可能会这样子。
------解决方案--------------------
_EnumList是全局静态就应该考虑并发问题。
可以用父接口ICOLLECION的SyncRoot静态成员lock
也可以定义static object来lock