风动破

导航

设计模式之生产者消费者

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;
            }));
        }
    }

 

posted on 2015-04-23 15:32  风动破  阅读(115)  评论(0)    收藏  举报