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

it2022-05-08  11

在.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向多个消费者中输出数据,非常方便。

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

转载于:https://www.cnblogs.com/TianFang/archive/2009/11/08/1598689.html

相关资源:垃圾分类数据集及代码

最新回复(0)