设计模式之生产者消费者
public class Consumer
{
Queue container = null;
//得到一个容器
public Consumer(Queue container)
{
this.container = container;
}
//定义一个消费的方法
public void Consumption(ConProLink.ProducerHandle producerHandle)
{
IGoods goods = (IGoods)this.container.Peek();
//goods.Execute();
producerHandle(goods.Execute());
Console.Write("消费了物品:" + goods.Execute());
//消费掉容器中的一个物品
this.container.Dequeue();
Console.WriteLine(" 剩余:" + this.container.Count);
}
}
//(2) Producer表示生产类,同样有一个Queue表示容器,和Consumer类一样有一个得到容器的构造函数。主要方法是Product,表示生产一个物品的方法,具体代码如下:
public class Producer
{
Queue container = null;
//得到一个容器
public Producer(Queue container)
{
this.container = container;
}
//定义一个生产物品的方法装入容器
public void Product(IGoods obj)
{
//创建一个新物品装入容器
//Goods goods = new Goods();
//goods.Name = name;
this.container.Enqueue(obj);
Console.WriteLine("生产了物品:" + obj.ToString() + " 剩余:" + this.container.Count);
}
}
//(3) 接下来看看物品类Goods,这个表示生产者和消费者进行交互的物品,其中就一个属性Name表示名称,同时重写了ToString()方法。具体代码如下:
public interface IGoods
{
string Execute();
}
public class Goods:IGoods {
//物品名称
private string name;
private int p;
public Goods(int p,string name)
{
// TODO: Complete member initialization
this.p = p;
this.name = name;
}
public string Name
{
get { return name; }
set { name = value; }
}
//重写ToString()
public override string ToString()
{
return "物品名称:" + name+p;
}
public string Execute()
{
return this.ToString();
}
}
/// <summary>
/// 消费和生产线
/// </summary>
public class ConProLink
{
//创建一个消费者和生产者共用的一个容器
Queue container = new Queue();
Producer producer = null;
Consumer consumer = null;
public delegate void ProducerHandle(string goods);
public ProducerHandle producerHandle;
//定义一个线程方法生产8个物品
public void ThreadProduct(IGoods obj)
{
//创建一个生产者
producer = new Producer(this.container);
lock (this)
{
//for (int i = 1; i <= 10000; i++)
//{
//如果容器中没有就进行生产
if (this.container.Count == 0)
{
//调用方法进行生产
producer.Product(obj);
//生产好了一个通知消费者消费
Monitor.Pulse(this);
}
//容器中还有物品等待消费者消费后再生产
Monitor.Wait(this);
//}
}
}
//定义一个线程方法消费生产的物品
public void ThreadConsumption(ProducerHandle producerHandle)
{
//创建一个消费者
consumer = new Consumer(this.container);
lock (this)
{
while (true)
{
//如果容器中有商品就进行消费
if (this.container.Count != 0)
{
//调用方法进行消费
consumer.Consumption(producerHandle);
Monitor.Pulse(this);
}
//容器中没有商品通知消费者消费
Monitor.Wait(this);
}
}
}
}
===============================
表现形式WPF
public partial class MainWindow:Window {
ConProLink link = new ConProLink();
public MainWindow()
{
InitializeComponent();
//委托需要参数
ThreadStart t = new ThreadStart(delegate { p.ThreadConsumption(ConsumptionHandle); });
Thread t2 = new Thread(t);
t2.Start();
}
private int x = 0;
/// <summary>
/// 生产
/// </summary>
private void button1_Click(object sender, RoutedEventArgs e)
{
IGoods goods = new Goods(x++, "产品");
link.ThreadProduct(goods);
}
public void ConsumptionHandle(string goods)
{
this.Dispatcher.BeginInvoke(new Action(()=>
{
Console.WriteLine(goods);
textBlock1.Text = goods;
}));
}
}
浙公网安备 33010602011771号