字典什么时候在Add或ContainsKey上抛出IndexOutOfRangeException?

时间:2009-12-17 10:42:17

标签: .net dictionary synchronization

在一个繁忙的ASP .NET网站上,我有一个字典,它充当缓存,基本上存储键/值对以供以后检索。

在高负载时,Dictionary有时会进入一个状态,每当我调用ContainsKey或Add方法时它总是抛出一个IndexOutOfRangeException。异常发生在私有FindEntry方法中。

我怀疑这可能是由于同步问题造成的,但我不确定。

谁能告诉我在哪种情况下会发生这种情况?我的目标是收集足够的信息,以便我可以在开发环境中重现问题。

3 个答案:

答案 0 :(得分:21)

Dictionary州的文档:

  

不保证所有实例成员都是线程安全的。

     

要允许多个线程访问集合以进行读写,您必须实现自己的同步。

如果您没有同步Dictionary的访问权限,那么您可能会遇到类似您所描述的问题(可能是因为内部状态不再有效)。如果要在开发环境中尝试重现此操作,请尝试创建一个使用多个线程的程序,以便在不同步的情况下从Dictionary连续读取和写入。

答案 1 :(得分:1)

我同意这几乎肯定是同步问题。

我不知道有任何文档准确描述了这种情况何时以及如何发生 - 如果您以非线程安全的方式使用字典,则行为未定义。

为了在您的开发环境中进行测试,我建议运行一些并行线程,这些线程在一个连续循环中随机插入,删除,更新等(基本上是生产环境中发生的“集中”版本)。

答案 2 :(得分:0)