我们有一个非常严重的问题,每分钟造成数千例外。我们已经有了运行在的形式保存数据的本土缓存机制网站:.net Dictionary.Resize()异常 - 线程安全吗?
protected static IDictionary<int, IList<IInterfaceForData>> m_Data = null;
当我们调用添加这个字典中,我们得到了一个非常奇怪的现象:“指数外
if(Monitor.TryEnter(m_LockObj, 1000))
{
try
{
m_Data.Add(id, new List<IInterfaceForData>());
}
catch(Exception ex)
{
// log exception
}
finally
{
Monitor.Exit(m_LockObj);
}
}
:
m_Data.Add(id, new List<IInterfaceForData>());
我们使用这样的锁保护这一呼吁:数组”,当关键是100%没有在字典中的边界我们得到这个异常:
at System.Collections.Generic.Dictionary`2.Resize() at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
我们找不到任何解释这是因为异常有关词典的线程安全的,我们(我们认为)是线程安全的。我们对每个Add()和Remove()调用使用lock()或Monitor.TryEnter,除了m_Data.TryGetValue(...)
任何帮助将不胜感激。
非常感谢。
您还必须锁定'TryGetValue',以及读取或更新字典的其他内容。当某个其他线程同时添加或删除一个项目时,TryGetValue'倾向于表现不可预知的行为。 – 2011-03-02 21:05:12
也许你正在将* generic *字典上的'TryGetValue'与* concurrent *字典上的TryGetValue混淆,因为它们都是最近才引入的(.NET 3.5和.NET 4)。 – Justin 2011-03-02 21:19:20
@Justin:哇? '词典 .TryGetValue'已经存在了! –
2011-03-02 22:41:50