在一个繁忙的ASP .NET网站上,我有一个字典,它充当缓存,基本上存储键/值对以供以后检索。
在高负载时,Dictionary有时会进入一个状态,每当我调用ContainsKey或Add方法时它总是抛出一个IndexOutOfRangeException。异常发生在私有FindEntry方法中。
我怀疑这可能是由于同步问题造成的,但我不确定。
谁能告诉我在哪种情况下会发生这种情况?我的目标是收集足够的信息,以便我可以在开发环境中重现问题。
答案 0 :(得分:21)
Dictionary州的文档:
不保证所有实例成员都是线程安全的。
要允许多个线程访问集合以进行读写,您必须实现自己的同步。
如果您没有同步Dictionary
的访问权限,那么您可能会遇到类似您所描述的问题(可能是因为内部状态不再有效)。如果要在开发环境中尝试重现此操作,请尝试创建一个使用多个线程的程序,以便在不同步的情况下从Dictionary
连续读取和写入。
答案 1 :(得分:1)
我同意这几乎肯定是同步问题。
我不知道有任何文档准确描述了这种情况何时以及如何发生 - 如果您以非线程安全的方式使用字典,则行为未定义。
为了在您的开发环境中进行测试,我建议运行一些并行线程,这些线程在一个连续循环中随机插入,删除,更新等(基本上是生产环境中发生的“集中”版本)。
答案 2 :(得分:0)