温馨提示×

C# ManualResetEvent状态改变如何监听

c#
小樊
81
2024-10-12 09:30:02
栏目: 编程语言

在C#中,ManualResetEvent是一个用于同步线程的类,它有两个状态:SetReset。当ManualResetEvent的状态从Reset变为Set时,等待该事件的线程将被释放。为了监听ManualResetEvent的状态改变,你可以使用WaitOneWaitManyWaitAny方法。

以下是一个简单的示例,展示了如何使用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状态已改变"。最后,我们取消注册事件监听器并等待新线程结束。

0