accepted answer to question "Why does this Parallel.ForEach code freeze the program up?"建議在WPF應用程序中用ConcurrentBag替換List用法。何時使用BlockingCollection,何時使用ConcurrentBag代替列表<T>?
我想了解一個BlockingCollection是否可以在這種情況下使用呢?
accepted answer to question "Why does this Parallel.ForEach code freeze the program up?"建議在WPF應用程序中用ConcurrentBag替換List用法。何時使用BlockingCollection,何時使用ConcurrentBag代替列表<T>?
我想了解一個BlockingCollection是否可以在這種情況下使用呢?
確實可以使用BlockingCollection
,但這樣做絕對沒有意義。
首先,請注意BlockingCollection
是圍繞實現IProducerConsumerCollection<T>
的集合的包裝。對實現該接口任何類型都可以用作底層存儲:
當你創建一個
BlockingCollection<T>
對象,您可以指定不僅 的有限容量,而且收集的使用類型。例如,對於 示例,您可以指定首先輸入(FIFO)行爲的ConcurrentQueue<T>
對象,或最後輸入(LIFO)行爲的最後一個 的ConcurrentStack<T>
對象。您可以使用 實現IProducerConsumerCollection<T>
接口的任何集合類。BlockingCollection<T>
的默認 收集類型是ConcurrentQueue<T>
。
這包括ConcurrentBag<T>
,這意味着你可以有一個阻塞併發包。那麼簡單的IProducerConsumerCollection<T>
和阻塞集合有什麼區別?的BlockingCollection
文檔說(重點煤礦):
BlockingCollection<T>
被用作包裝用於IProducerConsumerCollection<T>
例如,允許去除從集合試圖 阻塞,直到數據可用於被去除。 類似地,BlockingCollection<T>
可以創建強制執行 上限在允許數據元素的數量的IProducerConsumerCollection<T>
[...]
由於在鏈接的問題也沒有必要做使用BlockingCollection
這些東西中的任何一個都只是增加了一層未使用的功能。
是的,你可以使用BlockingCollection
。 finishedProxies
將被定義爲:
BlockingCollection<string> finishedProxies = new BlockingCollection<string>();
,並添加一個項目,你可以這樣寫:
finishedProxies.Add(checkResult);
而且當它這樣做,你可以創建一個從內容的列表。
Jim Mischel,閱讀您的[.NET參考指南](http://www.informit.com/guides/guide.aspx?g=dotnet)。我希望我能早一點找到它,這樣我的實際需求非常接近 – Fulproof 2013-03-15 04:24:04
List<T>
是設計在單線程 應用程序使用的集合。
ConcurrentBag<T>
是ConcurrentCollection<T>
的子類型設計爲 以簡化在多線程環境中使用集合。如果您使用ConcurrentCollection ,則不必鎖定 集合以防止其他線程損壞。您可以插入 或從您的收藏中獲取數據,而無需編寫特殊的鎖定代碼。
BlockingCollection<T>
旨在擺脫 檢查線程在 之間的共享集合中是否有新數據可用的要求。如果有新數據插入到共享集合中,那麼消費者線程將立即喚醒。因此,如果消費者線程在特定時間 間的典型時間段內有新的數據可用,則不必檢查 。
@ Jon,謝謝,這幫助我打破了懵懂之境,並且在我真正需要ConcurrentDictionary時停止研究ConcurrentBag和BlockingCollection的時間 – Fulproof 2013-03-15 04:14:35