【问题标题】:When does a dictionary throw an IndexOutOfRangeException on Add or ContainsKey?字典何时在 Add 或 ContainsKey 上引发 IndexOutOfRangeException?
【发布时间】:2009-12-17 10:42:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你是否重写了 Equals 方法,它也在内部用于比较对象?

标签: .net dictionary synchronization


【解决方案1】:

Dictionary 的文档指出:

一个 Dictionary 可以同时支持多个读取器,只要集合没有被修改。 ...要允许集合被多个线程访问以进行读写,您必须实现自己的同步。

如果您没有同步对Dictionary 的访问,那么您可能会遇到您所描述的问题(可能是因为内部状态不再有效)。如果您想尝试在您的开发环境中重现这一点,请尝试创建一个程序,该程序使用多个线程连续读取和写入 Dictionary 而无需同步。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2012-03-12
      • 1970-01-01
      • 2016-08-25
      • 2011-08-26
      • 1970-01-01
      • 2017-01-19
      相关资源
      最近更新 更多