添加到Hashset <t> </t>时的IndexOutOfRangeException

时间:2010-11-29 19:12:00

标签: c# .net hashset

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

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

2 个答案:

答案 0 :(得分:39)

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

答案 1 :(得分:5)

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