0

我見過ConcurrentBag和Parallel.ForEach被用於另一個問題。現在我想知道如果它是線程安全的,如果我使用常規的foreach而不是Parallel.ForEach從ConcurrentBag讀取數據。ConcurrentBag和foreach

因此,即使其他線程向ConcurrentBag添加數據和從ConcurrentBag移除數據我希望在特定線程中穿過包中的所有項目(它可以是該包的快照,因爲它不必是100%最新)並使用其他數據找到的數據。

所以我的問題是這裏沒有打破ConcurrentBag的threadsafety或我必須使用arallel.ForEach這裏可行嗎?

+1

像往常一樣,當有人降低能力時,請你也說出爲什麼downvote是? (我已經做了很多時間低估了自己,但是爲了說明爲什麼如果它不是100%清楚,因爲當他們沒有看到爲什麼他們被低估時不能從downvote學到),爲什麼會做出downvote。 tnx – Thomas

回答

3

對於您的情況,無論您是使用foreach還是Parallel.ForEach評估集合都沒有區別。很多事情都是如此。 Parallel.ForEach不會神奇地將枚舉員踢入某些特殊的線程安全模式。

From the fine manual

備註

枚舉代表的包裏的瞬間即時快照。在GetEnumerator被調用後它並不反映對集合的任何更新。枚舉器可以安全地同時使用包的讀取和寫入。

+1

does foreach自動使用GetEnumeration方法嗎?或者我必須像「foreach(MyObject current in MyConcurrentBag.GetEnumerator())」而不是「foreach(MyObject current in MyConcurrentBag)」那樣做? – Thomas

+0

[來自精細手冊](http://msdn.microsoft.com/ en-us/library/ttw7t8t6(v = vs.71).aspx)*計算實現IEnumerable的類型或聲明GetEnumerator方法的類型*概念上'foreach'調用'GetEnumerator',儘管編譯器和JIT優化器可能拉動手中的一些手勢 –

+1

好,所以應該叫它tnx(不知何故,我總是設法在手冊中找不到我搜索的東西^^) – Thomas