当前位置: 首页 > news >正文

BlockingCollection的使用


BlockingCollection实现了生产者/消费者模式,是对IProducerConsumerCollection<T>接口的实现。与其他Concurrent集合一样,每次Add或Take元素,都会导致对集合的lock。只有当确定需要在内存中创建一个生产者,消费者模式时,再考虑这个类。


MSDN中的示例用法:


using (BlockingCollection<int> bc = new BlockingCollection<int>())
    {
       Task.Factory.StartNew(() =>
       {
           for (int i = 0; i < 1000; i++)
           {
               bc.Add(i);
               Thread.Sleep(50); 
           }


           // Need to do this to keep foreach below from hanging
           bc.CompleteAdding();
       });


       // Now consume the blocking collection with foreach.
       // Use bc.GetConsumingEnumerable() instead of just bc because the
       // former will block waiting for completion and the latter will
       // simply take a snapshot of the current state of the underlying collection.
       foreach (var item in bc.GetConsumingEnumerable())
       {
           Console.WriteLine(item);
       }
   }


重点在于迭代时使用bc.GetConsumingEnumerable(),而不是直接对bc迭代。


可以在这里查看GetConsumingEnumerable的实现源码:
https://github.com/dotnet/corefx/blob/master/src/System.Collections.Concurrent/src/System/Collections/Concurrent/BlockingCollection.cs


public IEnumerable<T> GetConsumingEnumerable(CancellationToken cancellationToken)
        {
            CancellationTokenSource linkedTokenSource = null;
            try
            {
                linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _consumersCancellationTokenSource.Token);
                while (!IsCompleted)
                {
                    T item;
                    if (TryTakeWithNoTimeValidation(out item, Timeout.Infinite, cancellationToken, linkedTokenSource))
                    {
                        yield return item;
                    }
                }
            }
            finally
            {
                if (linkedTokenSource != null)
                {
                    linkedTokenSource.Dispose();
                }
            }
        }



会不断的check IsCompleted属性:
public bool IsCompleted
        {
            get
            {
                CheckDisposed();
                return (IsAddingCompleted && (_occupiedNodes.CurrentCount == 0));
            }
        }


会判断生产者线程是否已经完成添加并且没有元素被消费。



参考链接:
https://msdn.microsoft.com/en-us/library/dd267312(v=vs.110).aspx

相关文章:

  • 配置本地IIS的证书访问的权限
  • 如何设置水晶报表(crystal reports)的字段自动换行
  • Xamarin nuget package update 错误
  • Xamarin部署时遇到错误: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]
  • CrystalReport显示HTML标记
  • Xamarin 编译错误: The file obj-Release-android-bin-package_resources does not exist
  • 一些.NET 项目中常用的类库
  • update-database 到azure sql database
  • 打印机
  • azure Machine learing studio 使用示例之 - 使用线性回归算法完成预测评估
  • [WinDBG 技巧] 列举所有Handle(句柄)以及查看Handle 信息
  • Xamarin Dropdown menu
  • [IE 技巧] 显示/隐藏IE 的菜单/工具栏
  • azure 机器学习算法分类
  • AutoFac 简单好用的IOC
  • Javascript 原型链
  • Java多线程(4):使用线程池执行定时任务
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • MySQL数据库运维之数据恢复
  • SOFAMosn配置模型
  • sublime配置文件
  • 分布式熔断降级平台aegis
  • 回顾2016
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何解决微信端直接跳WAP端
  • 使用putty远程连接linux
  • 微信支付JSAPI,实测!终极方案
  • gunicorn工作原理
  • Java数据解析之JSON
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​香农与信息论三大定律
  • # centos7下FFmpeg环境部署记录
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)IOS中获取各种文件的目录路径的方法
  • (轉貼) UML中文FAQ (OO) (UML)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .describe() python_Python-Win32com-Excel
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET gRPC 和RESTful简单对比
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @Autowired 与@Resource的区别
  • @ConfigurationProperties注解对数据的自动封装
  • [Android] Android ActivityManager
  • [AX]AX2012 R2 出差申请和支出报告
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [c++] C++多态(虚函数和虚继承)
  • [CF543A]/[CF544C]Writing Code