.NET(C#):线程安全集合的阻塞BlockingCollection的使用

来源:未知 责任编辑:责任编辑 发表时间:2014-03-23 22:28 点击:

目录
• 1. 限制最大容量:BoundedCapacity
• 2. 禁止加入:CompleteAdding和IsCompleted
• 3. 枚举:GetConsumingEnumerable和BlockingCollection本身
• 4. GetConsumingEnumerable和CompleteAdding
 
 
返回目录
1. 限制最大容量:BoundedCapacity
BoundedCapacity属性和CompleteAdding方法,它们都可以从某种方式上限制元素被加入到集合中。但BoundedCapacity是用来限制集合的最大容量,当容量已满后,后续的添加操作会被阻塞,一旦有元素被移除,那么阻塞的添加操作会成功执行。
 
比如下面代码,试图将1-50加入到BlockingCollection,此时默认内部是ConcurrentBag,当然你可以指定任意IProducerConsumerCollection。我们把BoundedCapacity设置成2。
 
var bcollec = new BlockingCollection<int>(2);
//试图添加1-50
Task.Run(() =>
    {
        Parallel.For(1, 51, i =>
        {
            bcollec.Add(i);
            Console.WriteLine("加入:" + i);
        });
    });
 
Thread.Sleep(1000);
Console.WriteLine("调用一次Take");
bcollec.Take();
 
Thread.Sleep(Timeout.Infinite);
 
可能的输出:
加入:37
加入:13
调用一次Take
加入:25
 
只有最多两个可以加入,然后调用Take后,下一个元素才会被加入。(注意此时Parallel.For中会有多个线程处于阻塞状态,因为无法加入数据)。
 
 
 
返回目录
2. 禁止加入:CompleteAdding和IsCompleted
 
CompleteAdding方法则是直接不允许任何元素被加入集合,即使是当前元素的数量小于BoundedCapacity属性。
 
代码:
var bcollec = new BlockingCollection<int>(5);
//试图添加1-50
Task.Run(() =>
    {
        Parallel.For(1, 51, i =>
        {
            Console.WriteLine("准备加入:" + i);
            bcollec.Add(i);
            Console.WriteLine("== 成功加入:" + i);
            Thread.Sleep(1000);
        });
    });
 
//等待一小段时间后马上调用CompleteAdding
Thread.Sleep(500);
Console.WriteLine("调用CompleteAdding");
bcollec.CompleteAdding();
 
Thread.Sleep(Timeout.Infinite);
 
上述代码可能的输出:
准备加入:1
准备加入:13
准备加入:25
准备加入:37
== 成功加入:13
== 成功加入:1

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • 浅析.NET下XML数据访问新机制
  • asp.net 面试+笔试题目第1/2页
  • C# 邮件地址是否合法的验证
  • C#高级编程:数据库连接[1]
  • asp.net 设置GridView的选中行的实现代码
  • 经典C++程序1
  • IIS 自动回收导致后台定时器失效的问题解决
  • ASP.NET&#160;GridView列表代码示例
  • 微软ASP.NET站点部署指南(3):使用Web.Config文件的Transforma
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1