错误一 异常详细信息: 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