AutoResetEvent
是 C# 中一个非常有用的同步原语,它允许一个或多个线程等待,直到另一个线程发出信号为止。AutoResetEvent
在某些场景下非常有用,比如生产者-消费者模式、线程池等。以下是一些使用 AutoResetEvent
的案例:
1. 生产者-消费者模式
生产者-消费者模式是一种常见的并发编程模式,其中一个或多个生产者线程生成数据并将其放入共享缓冲区(队列),而一个或多个消费者线程从共享缓冲区中取出数据并进行处理。AutoResetEvent
可以用于同步生产者和消费者线程。
using System; using System.Threading; class ProducerConsumer { private static AutoResetEvent _producerReady = new AutoResetEvent(false); private static AutoResetEvent _consumerReady = new AutoResetEvent(true); private static int[] _buffer = new int[10]; private static int _producerIndex = 0; private static int _consumerIndex = 0; static void Main() { Thread producerThread = new Thread(Producer); Thread consumerThread = new Thread(Consumer); producerThread.Start(); consumerThread.Start(); producerThread.Join(); consumerThread.Join(); } static void Producer() { while (true) { _producerReady.WaitOne(); // 等待消费者准备好 _buffer[_producerIndex] = GenerateProduct(); _producerIndex = (_producerIndex + 1) % _buffer.Length; Console.WriteLine("Produced: " + _buffer[_producerIndex]); _consumerReady.Set(); // 通知消费者 } } static void Consumer() { while (true) { _consumerReady.WaitOne(); // 等待生产者准备好 int product = _buffer[_consumerIndex]; _consumerIndex = (_consumerIndex + 1) % _buffer.Length; Console.WriteLine("Consumed: " + product); _producerReady.Set(); // 通知生产者 } } static int GenerateProduct() { return new Random().Next(); } }
2. 线程池
AutoResetEvent
也可以用于线程池中的任务调度。线程池允许你重用已经创建的线程,从而减少线程创建和销毁的开销。你可以使用 AutoResetEvent
来同步线程池中的任务,确保它们按照预期的顺序执行。
注意:在实际应用中,线程池的使用通常会更加复杂,涉及到任务的排队、执行、完成等。上面的示例仅用于演示 AutoResetEvent
的基本用法。
3. 同步多个线程
AutoResetEvent
还可以用于同步多个线程,确保它们按照预期的顺序执行。例如,你可以使用 AutoResetEvent
来确保主线程在继续执行之前等待其他线程完成某些操作。
using System; using System.Threading; class SynchronizeThreads { private static AutoResetEvent _event = new AutoResetEvent(false); static void Main() { Thread thread1 = new Thread(Thread1); Thread thread2 = new Thread(Thread2); thread1.Start(); thread2.Start(); _event.WaitOne(); // 等待线程1完成 _event.Set(); // 通知主线程继续执行 thread1.Join(); thread2.Join(); } static void Thread1() { Console.WriteLine("Thread 1 started."); Thread.Sleep(1000); // 模拟耗时操作 Console.WriteLine("Thread 1 completed."); _event.Set(); // 通知主线程继续执行 } static void Thread2() { _event.WaitOne(); // 等待线程1完成 Console.WriteLine("Thread 2 started."); Thread.Sleep(1000); // 模拟耗时操作 Console.WriteLine("Thread 2 completed."); } }
这些示例展示了 AutoResetEvent
在不同场景下的基本用法。你可以根据自己的需求调整代码以满足特定的同步需求。