zoukankan      html  css  js  c++  java
  • C# BlockCollection

    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

  • 相关阅读:
    天才难过四级关
    肉鸟一只
    继续折腾mac。os(没进展)
    Intel(R) ICH9M LPC Interface Controller 2919驱动安装方法
    nusoap的使用
    STL HASH_MAP简单应用
    jQuery select操作控制方法小结
    unordered_map详解
    STL map与Boost unordered_map
    [C/C++]关于C++11中的std::move和std::forward
  • 原文地址:https://www.cnblogs.com/gaobing/p/6008068.html
Copyright © 2011-2022 走看看