美文网首页
C#ManualResetEvent类

C#ManualResetEvent类

作者: 小羊爱学习 | 来源:发表于2025-04-29 16:57 被阅读0次

简介:

在 C# 中,ManualResetEvent 是一个用于线程同步的类,属于 System.Threading 命名空间。它允许一个或多个线程等待某个信号(事件),直到其他线程显式触发该信号为止。与 AutoResetEvent 不同,ManualResetEvent 在触发后会保持信号状态,直到手动重置。

信号状态:

  • 有信号(Signaled):所有调用 WaitOne() 的线程不会被阻塞。
  • 无信号(Non-signaled):所有调用 WaitOne() 的线程会被阻塞,直到调用 Set()。

基本用法:

  • initialState:初始化是否为有信号状态(true 表示有信号/或称 已触发,则线程一开始是无需等待信号的)。
var manualEvent = new ManualResetEvent(initialState: false); // 初始无信号
  • 关键方法:
方法 作用
Set() 将事件设为有信号状态,释放所有等待线程。
Reset() 将事件设为无信号状态,后续的 WaitOne() 会阻塞。
WaitOne() 阻塞当前线程,直到事件变为有信号状态。可以指定超时时间
Dispose() 释放资源(继承自 WaitHandle)。

示例:

private static ManualResetEvent manualEvent = new ManualResetEvent(false);
private void TestManualResetEvent()
{
    Thread worker = new Thread(DoWork);
    worker.Start();

    // 主线程触发信号
    Thread.Sleep(10000);
    Console.WriteLine("主线程发送信号");
    manualEvent.Set(); // 释放工作线程
}
private void DoWork()
{
    Console.WriteLine("工作线程等待信号...");
    bool b = manualEvent.WaitOne(); // 阻塞直到信号触发
    //bool b = manualEvent.WaitOne(1000); // 阻塞直到信号触发或1秒后才往下执行
    // 返回的是信号的状态
    Debug.WriteLine(b);
    Console.WriteLine("工作线程继续执行");
}

相关文章

网友评论

      本文标题:C#ManualResetEvent类

      本文链接:https://www.haomeiwen.com/subject/gtsfijtx.html