在C#中,ManualResetEvent
是一個用于同步線程的類,它有兩個狀態:Set
和Reset
。當ManualResetEvent
的狀態從Reset
變為Set
時,等待該事件的線程將被釋放。為了監聽ManualResetEvent
的狀態改變,你可以使用WaitOne
、WaitMany
或WaitAny
方法。
以下是一個簡單的示例,展示了如何使用ManualResetEvent
和事件監聽器來監聽狀態改變:
using System;
using System.Threading;
class Program
{
static ManualResetEvent _event = new ManualResetEvent(false); // 初始狀態為Reset
static event EventHandler<bool> _stateChanged; // 定義一個事件,當狀態改變時觸發
static void Main()
{
// 注冊事件監聽器
_stateChanged += OnStateChanged;
// 啟動一個線程,改變ManualResetEvent的狀態
Thread thread = new Thread(StateChangedThread);
thread.Start();
// 主線程等待事件觸發
_event.WaitOne();
Console.WriteLine("ManualResetEvent狀態已改變");
// 取消注冊事件監聽器
_stateChanged -= OnStateChanged;
thread.Join();
}
static void OnStateChanged(object sender, bool state)
{
Console.WriteLine($"ManualResetEvent狀態已變為: {state}");
_event.Set(); // 改變狀態為Set,喚醒等待的線程
}
static void StateChangedThread()
{
Thread.Sleep(1000); // 模擬一些操作
_event.Set(); // 改變狀態為Set,喚醒等待的線程
}
}
在這個示例中,我們創建了一個ManualResetEvent
實例,并將其初始狀態設置為Reset
。我們還定義了一個事件_stateChanged
,當ManualResetEvent
的狀態改變時觸發。
在Main
方法中,我們注冊了事件監聽器OnStateChanged
,并啟動了一個新線程StateChangedThread
,該線程將在1秒后改變ManualResetEvent
的狀態。主線程使用_event.WaitOne()
等待事件觸發,然后輸出"ManualResetEvent狀態已改變"。最后,我們取消注冊事件監聽器并等待新線程結束。