2010-11-29 59 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>上的實例方法不是線程安全的。特別是,當您嘗試添加一個元素時,會導致集合一次超過一個線程中現有數組的邊界,用於跟蹤該集合的大小和最後一個索引的實例變量該集合可以在兩個線程中更新。特別是,如果在第一個線程完成複製目標數組之前最後一個索引值由第二個線程(具有較大值)更新,則它可能會嘗試訪問本地數組中不存在的元素,因爲本地數組被分配的只佔第二個線程分配的元素的一半。

相關問題