>

类型支出中应用出现的个别事,项目开垦并发

- 编辑:www.bifa688.com -

类型支出中应用出现的个别事,项目开垦并发

在十二线程蒙受下,使用BlockingCollection以及ConcurrentQueue来消费生产者生产的能源,那是自个儿本人写的多生产者多消费者的作法,其实也是依附单个task下的隔阂队列的IsComplete来鉴其他。

品类支付中运用出现的点滴事,项目支付并发

在102线程情况下,使用BlockingCollection以及ConcurrentQueue来消费生产者生产的资源,这是自家自个儿写的多生产者多顾客的作法,其实也是基于单个task下的短路队列的IsComplete来鉴其他。

使用阻塞队列更简便然而当中的主顾线程相比吻合接纳单独的线程不合乎使用线程池,而且阻塞队列为空时会阻塞消费者线程,当然阻塞线程池内的线程也没怎么影响只是不推荐这么做,而且阻塞的队列的质量也从没ConcurrentQueue的质量高。

自己在品种中遇见多生产者多顾客难题,多生产者没不符合规律,但是如何在二十四线程下消费生产者的能源,那即是相比麻烦了,无法只是经过剖断数量来做,网络也找了有的能源,但是也都是给了个demo,还不全,本人想了个方法,临时缓慢解决了,回头在研商下别人封装的依靠Thread的作法。其实是在<<.NET 中的阻塞队列BlockingCollection的准确性张开药格局>>基础上做的,也未曾怎么,可是那是个好思路。后续尝试自身封装线程标识来做,不依赖FCL的封堵队列。code如下:

ConcurrentDictionary<string, string> dic1 = new ConcurrentDictionary<string, string>();
            ConcurrentDictionary<string, string> dic2 = new ConcurrentDictionary<string, string>();
            ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
            BlockingCollection<string> blockingCollection = new BlockingCollection<string>();

            var t = new Task[50];
            Console.WriteLine("生产者开始写入数据.............rn");

            for(int i=0; i<=49; i  )
            {
                t[i] = Task.Factory.StartNew((param) =>
                {
                    Console.WriteLine("生产者中 *** 阻塞队列输入: {0}", param.ToString());
                    blockingCollection.Add(param.ToString());
                    Console.WriteLine("生产者中 *** 阻塞队列的数量是: {0}", blockingCollection.Count);

                    Console.WriteLine("生产者中 *** 字典dic1输入: {0}", param.ToString());
                    dic1.TryAdd(param.ToString(), param.ToString());
                    Console.WriteLine("生产者中 *** 字典dic1的数量是: {0}", dic1.Count);

                    Console.WriteLine("生产者中 *** 字典dic2输入: {0}", param.ToString());
                    dic2.TryAdd(param.ToString(), param.ToString());
                    Console.WriteLine("生产者中 *** 字典dic2的数量是: {0}", dic2.Count);

                    Console.WriteLine("生产者中 *** 队列输入: {0}", param.ToString());
                    queue.Enqueue(param.ToString());
                    Console.WriteLine("生产者中 *** 队列的数量: {0}", queue.Count);
                }, i);
            }

            //Thread.Sleep(500);
            Console.WriteLine("rn消费者开始读入数据.............rn");

            while (!blockingCollection.IsCompleted)
            {
                Task tt = Task.Factory.StartNew(() =>
                {
                    foreach (var b in blockingCollection.GetConsumingEnumerable())
                    {
                        Console.WriteLine("消费者中 *** 字典dic1的数量是: {0}", dic1.Count);
                        Console.WriteLine("消费者中 *** 字典dic2的数量是: {0}", dic2.Count);

                        Console.WriteLine("消费者中 *** 阻塞队列的数量是: {0}", blockingCollection.Count);

                        string value1 = "";
                        string value2 = "";
                        dic1.TryGetValue(b, out value1);
                        dic2.TryGetValue(b, out value2);

                        Console.WriteLine("消费者中 *** 字典dic1的键值{0}的value值是: {1}", b, value1);
                        Console.WriteLine("消费者中 *** 字典dic1的键值{0}的value值是: {1}", b, value2);
                        Console.WriteLine("消费者中 *** 队列的数量是: {0}", queue.Count);
                        Console.WriteLine("消费者中 *** 字典的数量是: {0}", dic1.Count);

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

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

参考:

.Net中的并行编制程序-七.基于BlockingCollection完结高品质异步队列

在八线程景况下,使用BlockingCollection以及ConcurrentQueue来消费生产者生产的能源,那是自身要好写...

动用阻塞队列更简明不过里面包车型地铁消费者线程相比相符利用单独的线程不符合使用线程池,而且阻塞队列为空时会阻塞消费者线程,当然阻塞线程池内的线程也没怎么影响只是不推荐这么做,而且阻塞的行列的特性也一直不ConcurrentQueue的个性高。

笔者在品种中相见多生产者多顾客难点,多生产者没失常,不过如何在八线程下消费生产者的能源,那正是比较艰苦了,无法只是经过判别数量来做,英特网也找了1部分能源,可是也都以给了个demo,还不全,本人想了个方法,最近减轻了,回头在钻探下旁人封装的依靠Thread的作法。其实是在<<.NET 中的阻塞队列BlockingCollection的不利张开药方式>>基础上做的,也从未什么,然则那是个好思路。后续尝试自身封装线程标识来做,不借助于FCL的短路队列。code如下:

ConcurrentDictionary<string, string> dic1 = new ConcurrentDictionary<string, string>();
            ConcurrentDictionary<string, string> dic2 = new ConcurrentDictionary<string, string>();
            ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
            BlockingCollection<string> blockingCollection = new BlockingCollection<string>();

            var t = new Task[50];
            Console.WriteLine("生产者开始写入数据.............rn");

            for(int i=0; i<=49; i  )
            {
                t[i] = Task.Factory.StartNew((param) =>
                {
                    Console.WriteLine("生产者中 *** 阻塞队列输入: {0}", param.ToString());
                    blockingCollection.Add(param.ToString());
                    Console.WriteLine("生产者中 *** 阻塞队列的数量是: {0}", blockingCollection.Count);

                    Console.WriteLine("生产者中 *** 字典dic1输入: {0}", param.ToString());
                    dic1.TryAdd(param.ToString(), param.ToString());
                    Console.WriteLine("生产者中 *** 字典dic1的数量是: {0}", dic1.Count);

                    Console.WriteLine("生产者中 *** 字典dic2输入: {0}", param.ToString());
                    dic2.TryAdd(param.ToString(), param.ToString());
                    Console.WriteLine("生产者中 *** 字典dic2的数量是: {0}", dic2.Count);

                    Console.WriteLine("生产者中 *** 队列输入: {0}", param.ToString());
                    queue.Enqueue(param.ToString());
                    Console.WriteLine("生产者中 *** 队列的数量: {0}", queue.Count);
                }, i);
            }

            //Thread.Sleep(500);
            Console.WriteLine("rn消费者开始读入数据.............rn");


       // 当IsCompleted标记为True时,GetConsumingEnumerable方法就可以跳出循环了,因此while可以加也可以不加
       while (!blockingCollection.IsCompleted)
            {
                Task tt = Task.Factory.StartNew(() =>
                {
                    foreach (var b in blockingCollection.GetConsumingEnumerable())
                    {
                        Console.WriteLine("消费者中 *** 字典dic1的数量是: {0}", dic1.Count);
                        Console.WriteLine("消费者中 *** 字典dic2的数量是: {0}", dic2.Count);

                        Console.WriteLine("消费者中 *** 阻塞队列的数量是: {0}", blockingCollection.Count);

                        string value1 = "";
                        string value2 = "";
                        dic1.TryGetValue(b, out value1);
                        dic2.TryGetValue(b, out value2);

                        Console.WriteLine("消费者中 *** 字典dic1的键值{0}的value值是: {1}", b, value1);
                        Console.WriteLine("消费者中 *** 字典dic1的键值{0}的value值是: {1}", b, value2);
                        Console.WriteLine("消费者中 *** 队列的数量是: {0}", queue.Count);
                        Console.WriteLine("消费者中 *** 字典的数量是: {0}", dic1.Count);

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

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

参考:

.Net中的并行编制程序-七.基于BlockingCollection完结高品质异步队列

本文由必发88手机版发布,转载请注明来源:类型支出中应用出现的个别事,项目开垦并发