AutoResetEvent
是 C# 中的一个同步原语,它允许多个线程在一个或多个线程中等待某个条件成立。当条件满足时,AutoResetEvent
会自动重置其状态,以便其他等待的线程可以继续执行。AutoResetEvent
的使用场景主要包括以下几种:
- 线程同步:当你需要在多个线程之间同步操作时,可以使用
AutoResetEvent
。例如,当一个线程完成某项任务后,通知其他等待的线程继续执行。
AutoResetEvent event1 = new AutoResetEvent(false); // 工作线程 Thread workerThread = new Thread(() => { // 执行任务 Thread.Sleep(1000); // 任务完成后,设置事件,唤醒等待的线程 event1.Set(); }); workerThread.Start(); // 主线程 event1.WaitOne(); // 等待工作线程完成任务 Console.WriteLine("任务已完成");
- 限制并发访问:当你需要限制对共享资源的并发访问时,可以使用
AutoResetEvent
。例如,当一个线程正在访问共享资源时,其他线程需要等待该线程释放资源。
AutoResetEvent event2 = new AutoResetEvent(true); object lockObject = new object(); // 工作线程 Thread workerThread = new Thread(() => { event2.WaitOne(); // 等待主线程释放锁 lock (lockObject) { // 访问共享资源 Console.WriteLine("访问共享资源"); } event2.Set(); // 释放锁,唤醒等待的线程 }); workerThread.Start(); // 主线程 lock (lockObject) { Console.WriteLine("访问共享资源"); } event2.Set(); // 释放锁,唤醒等待的线程
- 生产者-消费者模式:在生产者-消费者模式中,
AutoResetEvent
可以用于在生产者和消费者之间传递消息。生产者生产数据后,通过设置AutoResetEvent
通知消费者;消费者消费数据前,需要等待生产者设置AutoResetEvent
。
AutoResetEvent event3 = new AutoResetEvent(false); Queuequeue = new Queue (); // 生产者线程 Thread producerThread = new Thread(() => { for (int i = 0; i < 10; i++) { queue.Enqueue(i); event3.Set(); // 通知消费者 Thread.Sleep(100); } }); producerThread.Start(); // 消费者线程 Thread consumerThread = new Thread(() => { while (true) { event3.WaitOne(); // 等待生产者通知 int item; if (queue.TryDequeue(out item)) { Console.WriteLine($"消费数据: {item}"); } } }); consumerThread.Start(); producerThread.Join(); consumerThread.Join();
总之,AutoResetEvent
是一个非常有用的同步原语,可以帮助你在多线程编程中实现线程同步、限制并发访问以及生产者-消费者模式等场景。