C#ManualResetEvent类

简介:

在 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("工作线程继续执行");
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 非原创文章,网络收集,如遇原作者,请私聊会标明出处! 1--11 tcp协议中三次握手和四次挥手建立TCP需要三次...
    Juinjonn阅读 6,584评论 0 28
  • 1 简介 本文围绕如下三个知识点详细叙述OpenGL管道是如何处理指令: 如何查询OpenGL指令在管道内的执行进...
    RichardJieChen阅读 7,334评论 0 2
  • I/O设备处理必然让主程序停下来干等I/O的完成,对这个问题有 方法一:使用另一个线程进行I/O。这个方案可行,但...
    三万分之一阅读 7,180评论 1 1
  • 前言 在前文中,我们已经讨论了Android 渲染体系中整体流程。但是对于fence,每一个厂商对它的理解都有点点...
    yjy239阅读 26,165评论 12 19
  • 多个线程同时使用共享对象,这种情形被称为竞争条件(Race Condition),竞争条件是多线程环境中非常常见的...
    LH_晴阅读 8,807评论 0 2

友情链接更多精彩内容