ca88亚洲城官网自家要调用移动的某部具有批量收获物联网卡数据的接口。我得调用移动的某具有批量取物联网卡数据的接口。

BlockingCollection集合是一个所有阻塞功能的成团,它就是水到渠成了藏生产者消费者之算法功能。一般情形下,我们得因
生产者 – 消费者模式来落实产出。BlockingCollection<T>
类是极其好的缓解方案

BlockingCollection集合是一个有所阻塞功能的联谊,它就是瓜熟蒂落了藏生产者消费者之算法功能。一般情形下,我们好依据
生产者 – 消费者模式来实现产出。BlockingCollection<T>
类是极好的缓解方案

凑巧结束的物联网卡项目,我待调用移动的某部具有批量博物联网卡数据的接口,其实最要害的数就是物联网卡卡号,然后经就点儿个卡号去调整用别样的片单接口,最后拼接起来,就闹了物联网卡的整信息。但是问题来了,物联网卡数量多,而且每次调用接口还需要费上同一到片秒,如果正常的读取,那不足慢死,所以就就此连作来举行。我想到的凡死队列+生产者消费者模型,使用的梗塞队列是.net线程安全集合的BlockingCollection,
具体的足看《汝无能够错过.net
并作解决方案》《深切明阻塞队列》《.net
framework 4
线程安全概述》。
但问题来了,MSDN上的事例以及《C#
高级编程第九版》中之管道模型代码都是冲单个的Task,
在此地自己必是为此了差不多单Task去读取接口,为什么我一旦说马上点,多线程是不行测得,我如何鉴别阻塞队列已满,如何及时获得阻塞队列中的多寡,并无另行的取得呢?具体的简约demo,请圈《而莫可知错过.net
并作解决方案》。我同开始是这么写的:

刚结束的物联网卡项目,我待调用移动的某某具有批量取得物联网卡数据的接口,其实最要的数就是物联网卡卡号,然后通过就简单个卡号去调整用其他的鲜单接口,最后拼接起来,就发了物联网卡的圆信息。但是问题来了,物联网卡数量多,而且每次调用接口还需要费上一样到片秒,如果正常的读取,那不足慢死,所以即使就此连作来开。我想开的凡死队列+生产者消费者模型,使用的隔阂队列是.net线程安全集合的BlockingCollection,
具体的得扣押《您免可知错过.net
并作解决方案》《深深理解阻塞队列》《.net
framework 4
线程安全概述》。
然而问题来了,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();
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();

唯独结果:

唯独结果:

足见到,这结果来问题呀,按道理来讲foreach遍历完了不畏会出来呀,但是及时是死队列,肯定不是这样的,那么什么时能够挑来foreach循环?这便与BlockingCollection的设计有关了,我查看了生其的源码,原谅自己莫看明白,也就是未贴了。后来,我转了产代码,就化解问题了。

足看出,这结果来题目啊,按道理来讲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);
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);

结果:

结果:

自家从没写的不行详细,因为,只是做只记,平时学之上没留神到这些题目,没有遇上一定情景下之题材,项目支付被相遇了,就记下下。

自我从来不写的雅详细,因为,只是做只记,平时习之上从不注意到这些题材,没有碰面一定情景下的题目,项目支出中相见了,就记录下。

相关文章