线程同步之AutoResetEvent的使用

来源:互联网 发布:精通d3.js pdf 编辑:程序博客网 时间:2024/06/05 16:14
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ConsoleApplication2{    class ProducerConsumerQueue : IDisposable    {        EventWaitHandle wh = new AutoResetEvent(false );        Thread worker;        object locker = new object();//定义一个锁对象要跟踪的对象        Queue<string> tasks = new Queue<string>();        public ProducerConsumerQueue()        {            worker = new Thread(Work);            worker.Start();        }        public void EnqueueTask(string task)        {            lock (locker)            {                tasks.Enqueue(task);            }            wh.Set();//打开锁,此时调用WaitOne函数的线程可以继续往下执行        }        public void Dispose()        {            EnqueueTask(null);            worker.Join();//worker线程插队,先让worker线程执行完再继续执行原本的线程            wh.Close();//关闭锁对象释放资源        }        void Work()        {            while (true)            {                string task = null;                if (tasks.Count > 0)                {                    task = tasks.Dequeue();                    if (task == null)                        return;                }                if (task != null)                {                    Console.WriteLine("运行的任务: " + task);                    Thread.Sleep(1000);                }                else                {                    wh.WaitOne();//堵塞当前线程,直到wh调用了Set函数                }                        }        }    }    class Test    {        static void Main(string[] args)        {            using (ProducerConsumerQueue q = new ProducerConsumerQueue())            {                q.EnqueueTask("开始");                for (int i = 0; i < 10; i++)                    q.EnqueueTask("任务" + i);                q.EnqueueTask("结束!");            }        }    }}

原创粉丝点击