ManualResetEvent 是一個用于線程同步的類,它允許一個或多個線程等待,直到某個事件發生。它有兩個狀態:已觸發和未觸發。當事件處于未觸發狀態時,所有等待的線程將被阻塞,直到事件被手動觸發。當事件處于已觸發狀態時,等待的線程將被喚醒,繼續執行。
以下是 ManualResetEvent 的主要方法和屬性:
以下是一個使用 ManualResetEvent 的示例:
using System;
using System.Threading;
class Program
{
static ManualResetEvent manualResetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
Thread thread1 = new Thread(Work);
Thread thread2 = new Thread(Work);
thread1.Start();
thread2.Start();
// 等待一段時間
Thread.Sleep(2000);
// 觸發事件,喚醒等待的線程
manualResetEvent.Set();
// 等待線程執行完畢
thread1.Join();
thread2.Join();
Console.WriteLine("All threads completed.");
Console.ReadLine();
}
static void Work()
{
Console.WriteLine("Thread {0} waiting.", Thread.CurrentThread.ManagedThreadId);
// 等待事件的觸發
manualResetEvent.WaitOne();
Console.WriteLine("Thread {0} resumed.", Thread.CurrentThread.ManagedThreadId);
}
}
在上面的示例中,我們創建了兩個工作線程 thread1 和 thread2,并且讓它們等待 manualResetEvent 事件的觸發。在主線程中,我們等待了 2 秒鐘后,手動觸發了 manualResetEvent 事件。這樣,兩個工作線程就被喚醒,繼續執行,并最終輸出 “All threads completed.”。
ManualResetEvent 在多線程編程中非常有用,可以實現線程之間的同步和協調。需要注意的是,一旦 ManualResetEvent 被觸發,它會一直保持觸發狀態,直到我們調用 Reset() 方法將其重置為未觸發狀態。