zoukankan      html  css  js  c++  java
  • .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向多个消费者中输出数据,非常方便。

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

  • 相关阅读:
    [FAQ] GitHub 开启二次验证之后,如何通过 https clone 项目 ?
    [FAQ] GoLand 需要手动开启代码补全吗 ?
    [FAQ] 夏玉米 按规则查询域名靠谱吗 ?
    [FAQ] Error: com.mysql.jdbc.Driver not loaded. :jdbc_driver_library
    [php-src] Php内核的有趣高频宏
    [php-src] Php扩展开发的琐碎注意点、细节
    [ELK] Docker 运行 Elastic Stack 支持 TLS 的两种简单方式
    [Contract] Solidity 生成随机数方案
    [MySQL] 导入数据库和表的两种方式
    [ELK] 生产环境中 Elasticsearch 的重要配置项
  • 原文地址:https://www.cnblogs.com/TianFang/p/1598689.html
Copyright © 2011-2022 走看看