У нас очень серьезная проблема, вызывающая тысячи исключений в минуту. У нас есть веб-сайт с собственным механизмом кэширования, который хранит данные в виде:
protected static IDictionary<int, IList<IInterfaceForData>> m_Data = null;
и когда мы вызываем Add в этом словаре, мы получаем очень странное поведение: « Index находился за пределами массива », когда ключ был на 100% отсутствует в словаре:
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)
Мы не можем найти никакого объяснения этому, потому что исключение связано с безопасностью потока в словаре, и мы (думаем, что мы) безопасны для потоков. Мы используем lock () или Monitor.TryEnter при каждом вызове Add () и Remove (), за исключением m_Data.TryGetValue (...)
Любая помощь будет принята с благодарностью.
Большое спасибо.