线程同步之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("结束!"); } } }}