代码之家  ›  专栏  ›  技术社区  ›  driis

字典什么时候在add或containskey上抛出indexoutofrangeexception?

  •  22
  • driis  · 技术社区  · 15 年前

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

    在高负载情况下,字典有时会进入一种状态,在这种状态下,每当我调用containsKey或add方法时,它总是抛出indexoutofrangeexception。异常发生在private findentry方法内部。

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

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

    3 回复  |  直到 15 年前
        1
  •  21
  •   Phil Ross Matt Johnson-Pint    15 年前

    文件 Dictionary 国家:

    任何实例成员都不能保证是线程安全的。

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

    如果不同步访问 Dictionary ,那么您可能会遇到类似您描述的问题(可能是因为内部状态不再有效)。如果您想在开发环境中尝试重现这个过程,那么尝试创建一个使用多个线程从 词典 没有同步。

        2
  •  1
  •   LukeH    15 年前

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

    我不知道有什么文档能准确描述这种情况发生的时间和方式——如果您以非线程安全的方式使用字典,那么行为是未定义的。

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

    推荐文章