>

你真的知道必发88手机版

- 编辑:www.bifa688.com -

你真的知道必发88手机版

BlockingCollection群集是一个颇具阻塞作用的集纳,它便是水到渠成了出色生产者消费者的算法功效。一般意况下,大家得以凭仗生产者 - 消费者情势来兑现产出。BlockingCollection<T> 类是最棒的减轻方案

你实在知道.NET Framework中的阻塞队列BlockingCollection的妙用吗?,

BlockingCollection集合是二个怀有阻塞作用的集合,它正是做到了优秀生产者消费者的算法效用。一般意况下,我们得以依靠生产者 - 消费者格局来落实产出。BlockingCollection<T> 类是最棒的缓和方案

刚甘休的物联网卡项目,笔者急需调用移动的有些具备批量拿走物联网卡数据的接口,其实最重视的数量正是物联网卡卡号,然后通过那多少个卡号去调用别样的四个接口,最终拼接起来,就有了物联网卡的完好音信。可是难点来了,物联网卡数量多,而且每趟调用接口还必要费上一到两秒,假诺平常的读取,那不足慢死,所以就用并发来做。作者想到的是阻塞队列 生产者消费者模型,使用的不通队列是.net线程安全集结的BlockingCollection, 具体的能够看《你无法错过.net 并发消除方案》《深远精通阻塞队列》《.net framework 四 线程安全概述》。
然则难点来了,MSDN上的例子以及《C# 高档编制程序第九版》中的管道模型代码都以依靠单个的Task, 在此地自身自然是用了多少个Task去读取接口,为何小编要说那一点,四线程是不行测得,小编什么辨别阻塞队列已满,怎么着及时获取阻塞队列中的数据,并不重复的获得呢?具体的总结demo,请看《你无法错过.net 并发化解方案》。笔者壹初阶是那样写的:

BlockingCollection<string> blockingCollection = new BlockingCollection<string>();
            ConcurrentQueue<string> concurrentQueue = new ConcurrentQueue<string>();

            var t = new Task[50];
            for (int i = 0; i <= 49; i  )
            {
                t[i] = Task.Factory.StartNew((obj) =>
                {
                    Thread.Sleep(2500);
                    blockingCollection.Add(obj.ToString());
                    concurrentQueue.Enqueue(obj.ToString());
                    Console.WriteLine("Task中的数据: {0}", obj.ToString());
                }, i   1);
            }

            Thread.Sleep(5000);
            while (!blockingCollection.IsCompleted)
            {
                foreach (var b in blockingCollection.GetConsumingEnumerable())
                {
                    Console.WriteLine("开始输出阻塞队列: {0}", b);
                    Console.WriteLine(blockingCollection.IsCompleted);
                    Console.WriteLine("并发队列的数量: {0}", concurrentQueue.Count);
                }

                Console.WriteLine("调用GetConsumingEnumerable方法遍历完之后阻塞队列的数量: {0}", blockingCollection.Count);

                if (concurrentQueue.Count == 50)
                {
                    blockingCollection.CompleteAdding();
                }
            }

            Console.WriteLine("********");

            Console.WriteLine("是否完成添加: {0}", blockingCollection.IsAddingCompleted);

            Console.Read();

可是结果:
必发88手机版 1

能够看出,那结果卓殊呀,按道理来说foreach遍历完了就能够出来啊,可是那是阻塞队列,确定不是那般的,那么如何时候能挑出foreach循环?那就和BlockingCollection的宏图有关了,小编翻看了下它的源码,原谅本人从不看懂,也就不贴了。后来,小编改了下代码,就减轻难题了。

BlockingCollection<string> blockingCollection = new BlockingCollection<string>();
            ConcurrentQueue<string> concurrentQueue = new ConcurrentQueue<string>();

            var t = new Task[50];
            for (int i = 0; i <= 49; i  )
            {
                t[i] = Task.Factory.StartNew((obj) =>
                {
                    Thread.Sleep(2500);
                    blockingCollection.Add(obj.ToString());
                    concurrentQueue.Enqueue(obj.ToString());
                    Console.WriteLine("Task中的数据: {0}", obj.ToString());
                }, i 1);
            }

            Thread.Sleep(5000);
            while (!blockingCollection.IsCompleted)
            {
                foreach (var b in blockingCollection.GetConsumingEnumerable())
                {
                    Console.WriteLine("开始输出阻塞队列: {0}", b);
                    Console.WriteLine(blockingCollection.IsCompleted);
                    Console.WriteLine("并发队列的数量: {0}", concurrentQueue.Count);
                    if (concurrentQueue.Count == 50)
                    {
                        blockingCollection.CompleteAdding();
                    }
                }
                Console.WriteLine("调用GetConsumingEnumerable方法遍历完之后阻塞队列的数量: {0}", blockingCollection.Count);

            }

            Console.WriteLine("********");

            Console.WriteLine("是否完成添加: {0}", blockingCollection.IsAddingCompleted);

结果:
必发88手机版 2

作者没有写的很详细,因为,只是做个笔记,日常攻读的时候从不留意到那么些主题材料,未有碰着一定情景下的标题,项目开支中境遇了,就记录下。

Framework中的阻塞队列BlockingCollection的妙用吗?, BlockingCollection会集是2个具备阻塞成效的集中,它便是形成了卓绝生产者消...

刚停止的物联网卡项目,笔者供给调用移动的某部具备批量得到物联网卡数据的接口,其实最要害的数额正是物联网卡卡号,然后经过那八个卡号去调用任何的五个接口,最终拼接起来,就有了物联网卡的壹体化音信。然则难点来了,物联网卡数量多,而且每趟调用接口还须求费上一到两秒,假设平常的读取,那不行慢死,所以就用并发来做。笔者想到的是阻塞队列 生产者消费者模型,使用的短路队列是.net线程安全群集的BlockingCollection, 具体的能够看《您不能错过.net 并发化解方案》《深刻领悟阻塞队列》《.net framework 四线程安全概述必发88手机版,》。
不过难点来了,MSDN上的事例以及《C# 高等编程第捌版》中的管道模型代码都以依照单个的Task, 在此间小编分明是用了四个Task去读取接口,为何自身要说那点,四线程是不足测得,小编如何鉴定区别阻塞队列已满,怎么着及时获得阻塞队列中的数据,并不另行的拿走呢?具体的归纳demo,请看《您无法错过.net 并发消除方案》。笔者一开端是那般写的:

BlockingCollection<string> blockingCollection = new BlockingCollection<string>();
            ConcurrentQueue<string> concurrentQueue = new ConcurrentQueue<string>();

            var t = new Task[50];
            for (int i = 0; i <= 49; i  )
            {
                t[i] = Task.Factory.StartNew((obj) =>
                {
                    Thread.Sleep(2500);
                    blockingCollection.Add(obj.ToString());
                    concurrentQueue.Enqueue(obj.ToString());
                    Console.WriteLine("Task中的数据: {0}", obj.ToString());
                }, i   1);
            }

            Thread.Sleep(5000);
            while (!blockingCollection.IsCompleted)
            {
                foreach (var b in blockingCollection.GetConsumingEnumerable())
                {
                    Console.WriteLine("开始输出阻塞队列: {0}", b);
                    Console.WriteLine(blockingCollection.IsCompleted);
                    Console.WriteLine("并发队列的数量: {0}", concurrentQueue.Count);
                }

                Console.WriteLine("调用GetConsumingEnumerable方法遍历完之后阻塞队列的数量: {0}", blockingCollection.Count);

                if (concurrentQueue.Count == 50)
                {
                    blockingCollection.CompleteAdding();
                }
            }

            Console.WriteLine("********");

            Console.WriteLine("是否完成添加: {0}", blockingCollection.IsAddingCompleted);

            Console.Read();

可是结果:
必发88手机版 3

能够看看,那结果不经常呀,按道理来说foreach遍历完了就能出来啊,然则这是阻塞队列,肯定不是这么的,那么如曾几何时候能挑出foreach循环?那就和BlockingCollection的规划有关了,小编翻看了下它的源码,原谅小编从未看懂,也就不贴了。后来,小编改了下代码,就一下子就解决了问题了。

///// 后续补充

BlockingCollection的GetComsumingEnumerate方法跳出循环的表明是BlockingCollection的IsCompleteAdding为true并且BlockingCollection集合的多少为空

/////

BlockingCollection<string> blockingCollection = new BlockingCollection<string>();
            ConcurrentQueue<string> concurrentQueue = new ConcurrentQueue<string>();

            var t = new Task[50];
            for (int i = 0; i <= 49; i  )
            {
                t[i] = Task.Factory.StartNew((obj) =>
                {
                    Thread.Sleep(2500);
                    blockingCollection.Add(obj.ToString());
                    concurrentQueue.Enqueue(obj.ToString());
                    Console.WriteLine("Task中的数据: {0}", obj.ToString());
                }, i 1);
            }

            Thread.Sleep(5000);
            while (!blockingCollection.IsCompleted)
            {
                foreach (var b in blockingCollection.GetConsumingEnumerable())
                {
                    Console.WriteLine("开始输出阻塞队列: {0}", b);
                    Console.WriteLine(blockingCollection.IsCompleted);
                    Console.WriteLine("并发队列的数量: {0}", concurrentQueue.Count);
                    if (concurrentQueue.Count == 50)
                    {
                        blockingCollection.CompleteAdding();
                    }
                }
                Console.WriteLine("调用GetConsumingEnumerable方法遍历完之后阻塞队列的数量: {0}", blockingCollection.Count);

            }

            Console.WriteLine("********");

            Console.WriteLine("是否完成添加: {0}", blockingCollection.IsAddingCompleted);

结果:
必发88手机版 4

自家从没写的很详细,因为,只是做个笔记,平日攻读的时候从不留神到那些标题,未有碰到一定情景下的难点,项目开销中碰着了,就记下下。

本文由必发88手机版发布,转载请注明来源:你真的知道必发88手机版