当前位置: 代码迷 >> ASP.NET >> 做压力测试中碰到的奇怪有关问题
  详细解决方案

做压力测试中碰到的奇怪有关问题

热度:4584   发布时间:2013-02-25 00:00:00.0
做压力测试中碰到的奇怪问题
错误一 异常详细信息: 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
  相关解决方案