在我的代码中,我有一个静态字典对象
private static IDictionary< ConnKey, DbConnection > ConnectionList = new Dictionary< ConnKey, DbConnection >( );
这是抛出这个错误
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
我搜索并发现这是因为多个线程尝试访问字典,但我确实有lock
字典
lock( ConnectionList ) {
ConnectionList.Add( key, res );
}
然后我进行了更多搜索,发现锁定字典并不能阻止对它的所有操作,所以我应该像这样使用它lock
的SyncRoot
对象来实现我想要的
lock( ((IDictionary)ConnectionList).SyncRoot) {
但后来我搜索到使用SyncRoot
不是一个好习惯
在进一步搜索中,我发现有一个ConcurrentDictionary
用于此目的
- 那么任何人都可以建议我锁定字典的最佳方法吗
- 如果我使用
ConcurrentDictionary
它,我仍然需要使用lock
它还是它会自己处理所有事情。 - 如果我必须使用 lock on
ConcurrentDictionary
,我必须lock
直接使用它或再次我必须SyncRoot
为它锁定对象
提前致谢!