.Net4.0并行库介绍——System.Collections.Concurrent

在.net 4.0中新增了一个名字空间——System.Collections.Concurrent。它提供了一系列线程安全的常用容器,如下是一个根据System.Collections.Concurrent.BlockingCollection<>实现一个生产者/消费者的例子:

    static void Main(string[] args)
    {
        BlockingCollection<int> data = new BlockingCollection<int>(1);    //
这里有bug,由于count的计数问题,虽然这儿传入的是1,实际上容量是2,希望在正式版中修正

        var rnd = new Random();
        var index = 0;

        //Producer Task
        Task.Factory.StartNew(() =>
        {
            while (true)
            {
                Thread.Sleep(rnd.Next(5) * 300);
                var value = index++;
                data.Add(value);
                Console.WriteLine("procedured: " + value);
            }
        });

        //Consumer Task (
经典模式)
        Task.Factory.StartNew(() =>
        {
            while (true)
            {
                Thread.Sleep(rnd.Next(5) * 200);
                var value = data.Take();
                Console.WriteLine("eat: " + value);
            }
        });

        //Consumer Task (
现代模式)
        //Task.Factory.StartNew(() =>
        // {
        // foreach (var value in data.GetConsumingEnumerable())
        // {
        // Thread.Sleep(rnd.Next(5) * 200);
        // Console.WriteLine("eat: " + value);
        // }
        // });

        Thread.Sleep(Timeout.Infinite);
    }

整体方式非常简单,通过Add生产数据,通过Take消费数据,整体操作都是线程安全的,无需加锁,非常简洁。另外值得一提的是下面的那种foreach方式的消费者模式,看起来非常舒服,强烈推荐这种方式。

另外,可以通过BlockingCollection<int>.TakeFromAny方法从多个生产者中获取数据,也可以通过BlockingCollection<int>.AddToAny向多个消费者中输出数据,非常方便。

另外,在该名字空间下还提供了线程安全的堆、栈及键值对等,使用方式和非线程安全的时候差不多,这里就不多介绍了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值