当前位置:项目开发->项目经验 ->生产者消费者+阻塞队列在项目中的应用第三弹

原创版权标志生产者消费者+阻塞队列在项目中的应用第三弹

作者:阿郎  发表时间:2018/1/17 8:34:26  阅读:
[摘要] <<.NET 中的阻塞队列BlockingCollection的正确打开方式>> <<项目开发中应用如何并发处理的一二事>>后的第三弹
使用支付宝扫码领红包,余额宝付款才可以使用红包哦!不要忘记哈。每天扫一次,天天赚红包!!可以将二维码保存到手机,每天直接扫码领红包啦!!

    只给代码,此代码应用到了我的项目中:

    

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("生产者开始写入数据.............\r\n");
 
 for(int i=0; i<=49; i++)
 {
 t[i] = Task.Factory.StartNew((param) =>
 {
 Console.WriteLine("生产者中 *** 队列输入: {0}", param.ToString());
 queue.Enqueue(param.ToString());
 Console.WriteLine("生产者中 *** 队列的数量: {0}", queue.Count);

 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);

 Thread.Sleep(2000);

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

 Thread.Sleep(2000);
 
 }, i);
 }
 
 //Thread.Sleep(4000);
 Console.WriteLine("\r\n消费者开始读入数据.............\r\n");

 var t2 = new Task[50];

 for(int i=0; i<50; i++)
 {
 t2[i] = Task.Factory.StartNew(() =>
 {
 while(!blockingCollection.IsCompleted) // 通过此属性来标志并发的结束
 {
 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("消费者中 *** 字典dic2的键值{0}的value值是: {1}", b, value2);
 Console.WriteLine("消费者中 *** 队列的数量是: {0}", queue.Count);
 Console.WriteLine("消费者中 *** 字典的数量是: {0}", dic1.Count);

 if (queue.Count == 50)
 {
 blockingCollection.CompleteAdding();
 Console.WriteLine("阻塞队列已满");
 }
 }
 }
 });
 }

 // 可能由于业务原因,必须等到返回结果后才能进行后续处理....
 Task.WaitAll(t2);
 Console.WriteLine("阻塞队列是否完成添加并为空: {0}", blockingCollection.IsCompleted);
 具体的请看,摘要里的两篇文章

    

微信扫码关注公众号CPP技术网,微信号cpp_coder,关注我们的公众号,阅读更多精彩内容!每天还可以领取大红包哦!!!每天还可以领取大红包哦!!!每天还可以领取大红包哦!!!
文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)