为线程安全集合提供阻塞和限制功能
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 }