我们遇到了一个非常严重的问题,导致每分钟出现数千个异常。我们有一个网站,运行着一个自制的缓存机制,以以下形式保存数据:
我们使用以下方式来保护此调用:
我们无法为此提供任何解释,因为异常与字典的线程安全相关,而我们(认为我们)是线程安全的。我们在每个Add()和Remove()调用上使用lock()或Monitor.TryEnter,除了m_Data.TryGetValue(...)。
非常感谢您的帮助。
protected static IDictionary<int, IList<IInterfaceForData>> m_Data = null;
当我们在这个字典上调用Add方法时,会出现非常奇怪的行为:“索引超出了数组边界”,即使该键明显不存在于字典中:
m_Data.Add(id, new List<IInterfaceForData>());
我们使用以下方式来保护此调用:
我们使用锁来保护此调用:
if(Monitor.TryEnter(m_LockObj, 1000))
{
try
{
m_Data.Add(id, new List<IInterfaceForData>());
}
catch(Exception ex)
{
// log exception
}
finally
{
Monitor.Exit(m_LockObj);
}
}
然后我们会收到这个异常:
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
еҫҖеҫҖдјҡиЎЁзҺ°еҮәдёҚеҸҜйў„жөӢзҡ„иЎҢдёәгҖӮ - Jim MischelTryGetValue
和并发字典上的TryGetValue
,因为它们都是最近引入的(.NET 3.5和.NET 4)。 - JustinDictionary<TKey, TValue>.TryGetValue
早就存在了! - Dan TaoReaderWriterLockSlim
。它允许N个读者或1个写者。 - Jim Mischel