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
是一個非常有用的同步原語,可以幫助你在多線程編程中實現線程同步、限制并發訪問以及生產者-消費者模式等場景。