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

线程安全的生产者消费者模式
本文介绍了一个使用线程池实现的生产者消费者模式案例。通过BlockingCollection确保线程安全的数据交换,生产者线程不断生成数据,消费者线程则等待数据并进行处理,直至生产者通知不再生成新数据。
 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     }

 

转载于:https://www.cnblogs.com/xuejietong/p/8849475.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值