AutoResetEvent
是 C# 中一个非常有用的同步原语,它允许多个线程在一个事件上等待,直到另一个线程触发该事件。在并发编程中,AutoResetEvent
可以用于控制线程之间的执行顺序和同步。
以下是 AutoResetEvent
在并发编程中的一些应用场景:
AutoResetEvent
来确保它们按照预期的顺序执行。例如,主线程可以等待一个或多个工作线程完成任务,然后继续执行后续操作。AutoResetEvent syncEvent = new AutoResetEvent(false);
// 工作线程
Thread workerThread = new Thread(() =>
{
// 执行任务
Thread.Sleep(1000);
// 触发事件,通知主线程任务完成
syncEvent.Set();
});
workerThread.Start();
// 主线程
syncEvent.WaitOne(); // 等待工作线程完成任务
// 继续执行后续操作
AutoResetEvent
来限制同时访问资源的线程数量。例如,可以使用两个 AutoResetEvent
分别表示资源 A 和资源 B 的访问权限,当一个线程获得资源 A 的访问权限时,另一个线程必须等待资源 B 的访问权限被释放。AutoResetEvent resourceAAccessEvent = new AutoResetEvent(false);
AutoResetEvent resourceBAccessEvent = new AutoResetEvent(false);
// 线程 1:获取资源 A 访问权限
resourceAAccessEvent.WaitOne(); // 等待资源 A 可用
resourceAAccessEvent.Set(); // 释放资源 A 访问权限
// 线程 2:获取资源 B 访问权限
resourceBAccessEvent.WaitOne(); // 等待资源 B 可用
resourceBAccessEvent.Set(); // 释放资源 B 访问权限
AutoResetEvent
可以用于实现生产者-消费者模式,其中生产者和消费者线程分别负责生成数据和消费数据。生产者线程在完成数据生成后触发事件,消费者线程在收到事件后开始处理数据。AutoResetEvent dataReadyEvent = new AutoResetEvent(false);
Queue<int> dataQueue = new Queue<int>();
// 生产者线程
Thread producerThread = new Thread(() =>
{
for (int i = 0; i < 10; i++)
{
// 生成数据
int data = i;
// 将数据添加到队列中
lock (dataQueue)
{
dataQueue.Enqueue(data);
}
// 触发事件,通知消费者线程有新数据可用
dataReadyEvent.Set();
}
});
producerThread.Start();
// 消费者线程
Thread consumerThread = new Thread(() =>
{
while (true)
{
// 等待新数据可用
dataReadyEvent.WaitOne();
// 处理数据
lock (dataQueue)
{
int data = dataQueue.Dequeue();
Console.WriteLine($"Consumed: {data}");
}
}
});
consumerThread.Start();
总之,AutoResetEvent
是一个非常有用的同步原语,可以帮助您在 C# 中的并发编程中实现线程之间的同步和通信。