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

  • 相关阅读:
    Python基础-博客
    已开发程序查询
    新语法
    html基础
    python操作excel
    Selenium
    练习2---(request,ajax爬取头条数据)
    练习1---request+正则(猫眼电影)
    框架---scrapy(基本用法)
    框架---Scrapy (框架安装)
  • 原文地址:https://www.cnblogs.com/gaobing/p/6008068.html
Copyright © 2011-2022 走看看