您的位置:首页 > 其它

AutoResetEvent来模拟实现生产消费问题

2015-12-03 14:23 453 查看
static void Main(string[] args)

        {

            ProducerConsumerQueue q = new ProducerConsumerQueue();

            q.EnQueueTask("Hello");

            for (int i = 0; i < 10; i++) q.EnQueueTask("Say " + i);

            q.EnQueueTask("Goodbye!");

            Console.ReadKey();

        }

    }

    public class ProducerConsumerQueue

    {

        EventWaitHandle _wh = new AutoResetEvent(false);

        Queue<string> _tasks = new Queue<string>();

        object _locker = new object();

        public ProducerConsumerQueue()

        {

            //创建并启动工作线程

            Thread tr = new Thread(work);

            tr.Start();

        }

        public void EnQueueTask(string task)

        {

            lock (_locker)

                _tasks.Enqueue(task);

            _wh.Set();//一旦有任务了,唤醒等待的线程

        }

        public void work()

        {

            while (true)

            {

                string task = null;

                lock (_locker)

                {

                    if (_tasks.Count > 0)

                    {

                        task = _tasks.Dequeue();

                    }

                    if (task != null)

                    {

                        Console.WriteLine("Doing task " + task);

                        Thread.Sleep(1000);

                    }

                    else

                    {

                        _wh.WaitOne();

                    }

                }

            }

        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: