在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状态已改变"。最后,我们取消注册事件监听器并等待新线程结束。