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 }