【问题标题】:IndexOutOfRangeException when adding to Hashset<T>添加到 Hashset<T> 时出现 IndexOutOfRangeException
【发布时间】:2011-05-17 11:12:56
【问题描述】:

我有一个简单的应用程序,它将大约 700 万个短字符串添加到 HashSet&lt;string&gt;。有时我在调用 Hashset.Add() 期间遇到异常: System.Collections.Generic.HashSet`1.IncreaseCapacity(): Index was outside the bounds of the array。

这是一个间歇性问题,似乎与内存有关,但这是在 16 GB 的 win2k8 R2 服务器上,没有太多其他问题,大部分物理内存都可用。有什么想法吗?

【问题讨论】:

  • 你要添加多线程吗?
  • 我刚刚创建了一个项目,该项目使用 Parallelization 在 4 核 PC 上添加了 int.MaxValue Guids,并且没有失败。
  • 是的,这就是问题所在。我早该知道。谢谢赫兹迈斯特
  • @herz - 这是答案,您可能想发布它。

标签: c# .net hashset


【解决方案1】:

HashSet&lt;T&gt; 不是线程安全的。特别是在多线程场景中添加项目并且必须增加内部容量时,事情可能会不同步。

【讨论】:

  • +1 IndexOutOfRangeException 是一个明确的指标,表明当它从对集合的添加操作中抛出时存在运行时线程问题。
  • 谢谢,这很有帮助。我的项目正在使用Dictionary&lt;key, bool&gt;,直到我将其更改为 HashSet 并引发了一些越界异常才发现问题。不知道为什么它之前没有失败,因为 Dictionary 也不是线程安全的
【解决方案2】:

HashSet&lt;T&gt; 上的实例方法不是线程安全的。特别是,当您尝试添加一个元素时,会导致集合在多个线程中一次超过现有数组的边界,实例变量用于跟踪集合的大小和最后一个索引该集合可以在两个线程中更新。特别是,如果在第一个线程完成复制目标数组之前,第二个线程(具有更大的值)更新了最后一个索引值,它可能会尝试访问本地数组中不存在的元素,因为本地数组被分配的元素只有第二个线程分配的元素的一半。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2010-09-27
    • 1970-01-01
    相关资源
    最近更新 更多