1.BlockCollection集合是一個擁有阻塞功能的集合,它就是完成了經典生產者消費者的演算法功能。
它沒有實現底層的儲存結構,而是使用了IProducerConsumerCollection介面的幾個集合作為底層資料接結構,例如:ConcurrentBag、ConcurrentStack、ConcurrentQueue,你可以在構造BlockCollection例項的時候傳入這個引數,如果不指定的話,則預設使用ConcurrentQueue作為儲存結構。
2. 阻塞和退出
//GetConsumingEnumberable() 方法是關鍵,這個方法會遍歷集合去除資料,一旦集合空了,則阻塞自己,直到集合中又有了元素了在開始遍歷
foreach(string value in block.GetConsumingEnumberable()){}
2.1 如果集合中沒有資料,forearch將會阻塞直到新資料出現;
2.2 CompleteAdding()方法是直接不允許任 何元素被加入集合;
2.3 當使用了CompleteAdding()方法後且集合內沒有元素的時候,另一個屬性IsCompleted此時會為True,這個屬性可以用來判斷是否當前集合內的所有元素都被處理完;
2.4 當使用了CompleteAdding()方法後,物件停止往集合中新增資料,這時如果是使用GetConsumingEnumerable列舉的,那麼這種列舉會自然結束,不會再Block住集合,這種方式最優雅,也是推薦的寫法。但是如果是使用TryTake訪問元素的,則需要使用 IsCompleted判斷一下,因為這個時候使用TryTake會拋InvalidOperationException異常;
閱讀:http://www.cnblogs.com/chengxiaohui/articles/5672768.html