C# BlockCollection

时间:2022-10-03 03:38:13

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