为线程安全集合提供阻塞和限制功能

 1     class Program
 2     {
 3         //为线程安全集合提供阻塞和限制功能
 4         private static BlockingCollection<Int32> blockingCollection = new BlockingCollection<Int32>(new ConcurrentQueue<Int32>());
 5 
 6         static void Main(string[] args)
 7         {
 8             //由一个线程池线程执行“生产”
 9             ThreadPool.QueueUserWorkItem(ProduceItems);
10 
11             //由一个线程池线程执行“消费”
12             ThreadPool.QueueUserWorkItem(ConsumeItems, blockingCollection);
13 
14             Console.ReadLine();
15         }
16 
17         /// <summary>
18         /// 生产者
19         /// 一直生产,直到显式通知消费者不再生产
20         /// </summary>
21         /// <param name="obj"></param>
22         private static void ProduceItems(object obj)
23         {
24             for (int i = 0; i < 5; i++)
25             {
26                 Console.WriteLine("ProduceItems:" + i);
27                 blockingCollection.Add(i);
28             }
29 
30             //不再生产,通知消费者不会再有更多项了
31             blockingCollection.CompleteAdding();
32         }
33 
34         /// <summary>
35         /// 消费者
36         /// 一直消费(只要有),直到收到生产者通知不再生产
37         /// </summary>
38         /// <param name="obj"></param>
39         private static void ConsumeItems(object obj)
40         {
41             //阻塞,直到出现一项数据。出现后立即处理该数据
42             foreach (var item in blockingCollection.GetConsumingEnumerable())
43             {
44                 Console.WriteLine("ConsumeItems:" + item);
45             }
46 
47             //所有项“消费”完毕,没有更多的项再进入该队列,最后执行该行
48             Console.WriteLine("All done.");
49         }
50     }

 

posted on 2018-05-12 11:18  庭前花满留晚照  阅读(255)  评论(0编辑  收藏  举报

导航