C#生产者和消费者

开发 后端
本文介绍定义C#生产者和消费者,它们都只有一个方法ThreadRun(),以便在Main()函数中提供给线程的ThreadStart代理对象,作为线程的入口。

下面定义C#生产者和消费者,它们都只有一个方法ThreadRun(),以便在Main()函数中提供给线程的ThreadStart代理对象,作为线程的入口。

  1. public class CellProd  
  2. {  
  3. Cell cell; // 被操作的Cell对象  
  4. int quantity = 1; // 生产者生产次数,初始化为1  
  5.  
  6. public CellProd(Cell box, int request)  
  7. {  
  8. //构造函数  
  9. cell = box;  
  10. quantity = request;  
  11. }  
  12. public void ThreadRun( )  
  13. {  
  14. for(int looper=1; looper<=quantity; looper++)  
  15. cell.WriteToCell(looper); //生产者向操作对象写入信息  
  16. }  
  17. }  
  18.  
  19. public class CellCons  
  20. {  
  21. Cell cell;  
  22. int quantity = 1;  
  23.  
  24. public CellCons(Cell box, int request)  
  25. {  
  26. //构造函数  
  27. cell = box;  
  28. quantity = request;  
  29. }  
  30. public void ThreadRun( )  
  31. {  
  32. int valReturned;  
  33. for(int looper=1; looper<=quantity; looper++)  
  34. valReturned=cell.ReadFromCell( );//消费者从操作对象中读取信息  
  35. }  

然后在下面这个类MonitorSample的Main()函数中,我们要做的就是创建两个线程分别作为C#生产者和消费者,使用CellProd.ThreadRun()方法和CellCons.ThreadRun()方法对同一个Cell对象进行操作

  1. public class MonitorSample  
  2. {  
  3. public static void Main(String[] args)  
  4. {  
  5. int result = 0;   
  6. //一个标志位,如果是0表示程序没有出错,如果是1表明有错误发生  
  7. Cell cell = new Cell( );  
  8.  
  9. //下面使用cell初始化CellProd和CellCons两个类,生产和消费次数均为20次  
  10. CellProd prod = new CellProd(cell, 20);  
  11. CellCons cons = new CellCons(cell, 20);  
  12.  
  13. Thread producer = new Thread(new ThreadStart(prod.ThreadRun));  
  14. Thread consumer = new Thread(new ThreadStart(cons.ThreadRun));  
  15. //生产者线程和消费者线程都已经被创建,但是没有开始执行  
  16. try  
  17. {  
  18. producer.Start( );  
  19. consumer.Start( );  
  20.  
  21. producer.Join( );  
  22. consumer.Join( );  
  23. Console.ReadLine();  
  24. }  
  25. catch (ThreadStateException e)  
  26. {  
  27. //当线程因为所处状态的原因而不能执行被请求的操作  
  28. Console.WriteLine(e);  
  29. result = 1;  
  30. }  
  31. catch (ThreadInterruptedException e)  
  32. {  
  33. //当线程在等待状态的时候中止  
  34. Console.WriteLine(e);  
  35. result = 1;  
  36. }  
  37. //尽管Main()函数没有返回值,但下面这条语句可以向父进程返回执行结果  
  38. Environment.ExitCode = result;  
  39. }  

在上面的例程中,同步是通过等待Monitor.Pulse()来完成的。首先生产者生产了一个值,而同一时刻消费者处于等待状态,直到收到生产者的“脉冲(Pulse)”通知它生产已经完成,此后消费者进入消费状态,而生产者开始等待消费者完成操作后将调用Monitor.Pulese()发出的“脉冲 ”。

事实上,这个简单的例子已经帮助我们解决了多线程应用程序中可能出现的大问题,只要领悟了解决线程间冲突的基本方法,很容易把它应用到比较复杂的程序中去。以上介绍C#生产者和消费者。

【编辑推荐】

  1. C#结构体的特点浅析
  2. 介绍C#窗体拖动事件
  3. C#读取Excel遇到无法读取的解决方法
  4. 概述C#.NET操作XML
  5. C#基础概念学习笔记
责任编辑:佚名 来源: IT168
相关推荐

2015-08-26 09:39:30

java消费者

2024-10-11 09:27:52

2021-12-22 11:00:05

模型Golang语言

2024-03-14 11:58:43

2012-02-14 12:31:27

Java

2017-05-16 12:30:21

Python多线程生产者消费者模式

2021-08-31 10:26:24

存储

2021-04-20 08:32:51

消息MQ队列

2024-08-27 10:19:31

2021-12-28 12:01:59

Kafka 消费者机制

2020-09-14 08:45:58

多线程模型面试

2023-06-01 08:08:38

kafka消费者分区策略

2015-06-15 11:29:34

数据中心绿色数据中心

2011-07-22 16:25:38

CA TechnoloIT消费化

2011-08-05 16:21:24

2022-07-07 09:00:49

RocketMQ消费者消息消费

2011-11-15 10:05:29

Kindle Fire平板市场

2014-12-10 21:50:44

AdMaster

2015-06-29 15:00:20

云端数据消费者

2021-10-26 10:50:25

Kafkabroker
点赞
收藏

51CTO技术栈公众号