使用HashSet<string>
檢查項目之前是否處理過一個項目(即僅使用了Add
和Contains
)。此外,它是不相關的,當包含返回false,即使它之前加入...併發鎖定HashSet
我遇到不鎖定以下異常:
[IndexOutOfRangeException:索引是該數組的範圍之外] System.Collections.Generic.HashSet`1.AddIfNotPresent(T值)6108128
是否足夠,只鎖定在添加通話?
繼似乎永遠工作 - 但是這不是一個證明......
HashSet<string> hashSet = new HashSet<string>();
Parallel.ForEach(GetString(), h =>
{
hashSet.Contains(h);
lock(hashSetLock)
{
hashSet.Add(h);
}
hashSet.Contains(h);
});
爲了使它精確:我知道這是不是線程安全調用Contains
沒有鎖。我的問題是(接受誤報),如果上面的代碼可能會拋出一個異常,或者可能會破壞底層數據結構(= HashSet)的內部狀態。
這是您的實際代碼?因爲它沒有多大意義。 –
這只是一個測試重現它... – Markus
這不是一個很好的例子。以線程安全的方式生成這個哈希集有很多種方法。如果您確實想要從多個線程修改集合,則可以使用ConcurrentDictionary,它使用與鍵和值相同的值。 –