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);
Queue<int> queue = new Queue<int>();
// 生产者线程
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
是一个非常有用的同步原语,可以帮助你在多线程编程中实现线程同步、限制并发访问以及生产者-消费者模式等场景。