AutoResetEvent
是 C# 中一个非常有用的同步原语,它允许一个或多个线程等待,直到另一个线程发出信号为止。AutoResetEvent
在某些场景下非常有用,比如生产者-消费者模式、线程池等。以下是一些使用 AutoResetEvent
的案例:
生产者-消费者模式是一种常见的并发编程模式,其中一个或多个生产者线程生成数据并将其放入共享缓冲区(队列),而一个或多个消费者线程从共享缓冲区中取出数据并进行处理。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();
}
}
AutoResetEvent
也可以用于线程池中的任务调度。线程池允许你重用已经创建的线程,从而减少线程创建和销毁的开销。你可以使用 AutoResetEvent
来同步线程池中的任务,确保它们按照预期的顺序执行。
注意:在实际应用中,线程池的使用通常会更加复杂,涉及到任务的排队、执行、完成等。上面的示例仅用于演示 AutoResetEvent
的基本用法。
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
在不同场景下的基本用法。你可以根据自己的需求调整代码以满足特定的同步需求。