2010-11-29 69 views
15

我有一个简单的应用程序,它将约700万个短字符串添加到HashSet <string>。有时我会在调用Hashset.Add()期间遇到异常:System.Collections.Generic.HashSet`1.IncreaseCapacity():索引超出了数组的范围。IndexOutOfRangeException添加到Hashset时<T>

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

+5

你在添加多线程吗? – herzmeister 2010-11-29 19:14:13

+0

我刚刚创建了一个项目,它在使用并行化的4核PC上添加int.MaxValue Guids,并且不会失败。 – 2010-11-29 19:19:46

回答

35

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

5

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

相关问题