ManualResetEvent
是C#中一個非常有用的同步原語,它允許一個或多個線程等待,直到另一個線程設置事件。以下是如何正確使用ManualResetEvent
的基本步驟:
首先,你需要創建一個ManualResetEvent
的實例。你可以通過調用其構造函數并傳入一個布爾值來做到這一點。如果傳入true
,則事件初始化為已信號狀態;如果傳入false
,則事件初始化為非信號狀態。
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
當你希望線程等待某個事件發生時,你可以調用ManualResetEvent
的WaitOne
方法。這個方法會阻塞當前線程,直到事件變為已信號狀態。你可以通過傳入一個表示超時時間的參數來防止線程無限期地等待。
manualResetEvent.WaitOne(TimeSpan.FromSeconds(5));
在上面的例子中,線程將等待最多5秒鐘,然后繼續執行。 3. 在設置線程中使用ManualResetEvent
當你希望喚醒等待的線程時,你可以調用ManualResetEvent
的Set
方法。這將把事件設置為已信號狀態,從而喚醒所有等待該事件的線程。
manualResetEvent.Set();
在使用完ManualResetEvent
后,你應該調用其Close
方法來釋放與其關聯的資源。但是,從.NET Framework 4.0開始,ManualResetEvent
類實現了IDisposable
接口,因此你應該使用using
語句來確保資源被正確釋放。
using (ManualResetEvent manualResetEvent = new ManualResetEvent(false))
{
// 使用manualResetEvent的代碼
}
這是一個簡單的示例,展示了如何使用ManualResetEvent
來同步線程:
using System;
using System.Threading;
class Program
{
static ManualResetEvent manualResetEvent = new ManualResetEvent(false);
static void Main()
{
Thread thread1 = new Thread(DoWork);
Thread thread2 = new Thread(DoWork);
thread1.Start();
thread2.Start();
// 讓線程1完成工作
manualResetEvent.Set();
thread1.Join();
thread2.Join();
}
static void DoWork()
{
Console.WriteLine("線程開始等待事件...");
manualResetEvent.WaitOne(); // 阻塞,直到事件被設置
Console.WriteLine("線程繼續執行...");
}
}
在這個示例中,我們創建了兩個線程,它們都調用DoWork
方法。在DoWork
方法中,線程首先調用manualResetEvent.WaitOne()
來阻塞自己,直到事件被設置為已信號狀態。然后,主線程調用manualResetEvent.Set()
來喚醒等待的線程。最后,兩個線程繼續執行并輸出消息。