2013-03-14 20 views

回答

56

確實可以使用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這些東西中的任何一個都只是增加了一層未使用的功能。

+0

@ Jon,謝謝,這幫助我打破了懵懂之境,並且在我真正需要ConcurrentDictionary時停止研究ConcurrentBag和BlockingCollection的時間 – Fulproof 2013-03-15 04:14:35

1

是的,你可以使用BlockingCollectionfinishedProxies將被定義爲:

BlockingCollection<string> finishedProxies = new BlockingCollection<string>(); 

,並添加一個項目,你可以這樣寫:

finishedProxies.Add(checkResult); 

而且當它這樣做,你可以創建一個從內容的列表。

+2

Jim Mischel,閱讀您的[.NET參考指南](http://www.informit.com/guides/guide.aspx?g=dotnet)。我希望我能早一點找到它,這樣我的實際需求非常接近 – Fulproof 2013-03-15 04:24:04

6
  • List<T>是設計在單線程 應用程序使用的集合。

  • ConcurrentBag<T>ConcurrentCollection<T>的子類型設計爲 以簡化在多線程環境中使用集合。如果您使用ConcurrentCollection ,則不必鎖定 集合以防止其他線程損壞。您可以插入 或從您的收藏中獲取數據,而無需編寫特殊的鎖定代碼。

  • BlockingCollection<T>旨在擺脫 檢查線程在 之間的共享集合中是否有新數據可用的要求。如果有新數據插入到共享集合中,那麼消費者線程將立即喚醒。因此,如果消費者線程在特定時間 間的典型時間段內有新的數據可用,則不必檢查 。
相關問題