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# 中的并發編程中實現線程之間的同步和通信。