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

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

== 成功加入:37
== 成功加入:25
调用CompleteAdding
准备加入:2
准备加入:38
准备加入:26
准备加入:14
 
可以看到,虽然BlockingCollection的BoundedCapacity为5,但是由于提前调用了CompleteAdding,即使当前集合只有4个元素,也不会再同意新的加入操作了。
 
那么CompleteAdding有什么用?当使用了CompleteAdding方法后且集合内没有元素的时候,另一个属性IsCompleted此时会为True,这个属性可以用来判断是否当前集合内的所有元素都被处理完,而BlockingCollection背后的IProducerConsumerCollection恰恰常用来处理此类生产者-消费者问题的。
 
下面我们首先在多个线程中试图往BlockingCollection中加入元素,然后中途调用CompleteAdding,接着通过IsCompleted属性逐个处理被成功加入的元素。
 
如下代码:
var bcollec = new BlockingCollection<int>();
//试图添加1-50
Task.Run(() =>
    {
        Parallel.For(1, 51, i =>
        {
            bcollec.Add(i);
            Console.WriteLine("成功加入:" + i);
            Thread.Sleep(1000);
        });
    });
 
//等待一小段时间后马上调用CompleteAdding
Thread.Sleep(700);
Console.WriteLine("调用CompleteAdding");
bcollec.CompleteAdding();
 
Console.WriteLine("容器元素数量:" + bcollec.Count);
 
while (!bcollec.IsCompleted)
{
    var res = bcollec.Take();
    Console.WriteLine("取出:" + res);
}
 
Console.WriteLine("操作完成");
 
Thread.Sleep(Timeout.Infinite);
 
可能的输出:
成功加入:37
成功加入:25
成功加入:13
成功加入:1
调用CompleteAdding
容器元素数量:4
取出:1
取出:37
取出:25
取出:13
操作完成
 
 
返回目录
3. 枚举:GetConsumingEnumerable和BlockingCollection本身
BlockingCollection有两种枚举方法,首先BlockingCollection本身继承自IEnumerable<T>,所以它自己就可以被foreach枚举,首先BlockingCollection包装了一个线程安全集合,那么它自己也是线程安全的,而当多个线程在同时修改或访问线程安全容器时,BlockingCollection自己作为IEnumerable会返回一个一定时间内的集合片段,也就是只会枚举在那个时间点上内部集合的元素。
 
看下面代码:
var bcollec = new BlockingCollection<int>();
//试图添加1-10
Task.Run(() =>
{
    var forOpt = new ParallelOptions()
    {
        //防止在某些硬件上并发数太多
        MaxDegreeOfParallelism = 2
    };
 
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • 浅析.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