当前位置: 首页 > article >正文

【C#】 EventWaitHandle的用法

EventWaitHandle 是 C# 中用于线程间同步的一个类,它提供了对共享资源的访问控制,以及线程间的同步机制。EventWaitHandle 类位于 System.Threading 命名空间下,主要用于实现互斥访问、信号量控制等场景。

创建 EventWaitHandle

创建一个 EventWaitHandle 需要指定两个参数:初始状态和重置模式。

using System.Threading;

// 创建一个初始状态为未设置的自动重置事件
EventWaitHandle autoEvent = new EventWaitHandle(false, EventResetMode.AutoReset);

// 创建一个初始状态为设置的自动重置事件
EventWaitHandle manualEvent = new EventWaitHandle(true, EventResetMode.ManualReset);

使用 EventWaitHandle

设置和重置事件

  • Set(): 当事件被设置时,所有等待该事件的线程都将被释放。
  • Reset(): 将事件的状态重置为未设置状态。

对于 AutoReset 类型的 EventWaitHandle,一旦设置状态被触发后会立即重置回未设置状态。而 ManualReset 类型则需要显式地调用 Reset() 方法来重置事件。

manualEvent.Reset();
将manualEvent的状态重置为未设置(即信号量为假)。这通常意味着任何正在等待该事件的线程将继续等待。
对于ManualReset类型的EventWaitHandle,这是必须的;否则,即使已经调用了Set()方法,等待中的线程也不会被唤醒。
manualEvent.Set();
将manualEvent的状态设置为已设置(即信号量为真)。如果有任何线程正在等待这个事件,那么它们将不再等待并继续执行。
对于ManualReset类型的EventWaitHandle,状态需要手动重置才能再次等待。

manualEvent.Set(); // 手动设置事件
manualEvent.Reset(); // 手动重置事件

等待事件

  • WaitOne(): 使调用线程进入等待状态,直到事件被设置或者超时(如果指定了超时时间)。
autoEvent.WaitOne(); // 无限期等待事件被设置
bool result = autoEvent.WaitOne(5000); // 在5秒钟内等待事件被设置

如果写为 WaitOne(-1) 表示会使当前线程阻塞,直到manualEvent被设置(即信号量变为真)。
-1表示无限期地等待下去,直到事件被设置。如果想指定一个等待的超时时间,可以使用毫秒值作为参数。

 

示例

这里提供一个简单的例子来展示 EventWaitHandle 的基本用法:

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);

        Thread thread = new Thread(() =>
        {
            Console.WriteLine("Thread is waiting for the signal.");
            eventWaitHandle.WaitOne(); // 线程等待信号
            Console.WriteLine("Thread received the signal and continues execution.");
        });

        thread.Start();

        Thread.Sleep(2000); // 主线程等待两秒后发送信号
        Console.WriteLine("Main thread signals the waiting thread.");

        eventWaitHandle.Set(); // 发送信号
        eventWaitHandle.Close(); // 关闭事件句柄
    }
}

在这个例子中,我们创建了一个手动重置类型的 EventWaitHandle 并在线程中等待信号。主线程等待两秒后发送信号给等待的线程。当信号被发送后,等待的线程继续执行。注意,在使用完毕之后,应该关闭 EventWaitHandle

注意事项

  • EventWaitHandle 可以是命名的,这意味着它可以跨进程使用,但示例中没有展示这一点。
  • 如果使用命名的 EventWaitHandle,请确保正确处理互斥和权限问题。
  • 在使用完 EventWaitHandle 后,应当调用 Close() 方法来释放资源。

 

 


http://www.kler.cn/a/319952.html

相关文章:

  • 归子莫的科技周刊#2:白天搬砖,夜里读诗
  • 本地部署Web-Check网站检测与分析利器并实现远程访问实时监测
  • 【leetcode 13】哈希表 242.有效的字母异位词
  • word-break控制的几种容器换行行为详解
  • C#中的ref struct
  • vue中的那些事(刷新+key+v-if,v-for)
  • EchoMimic模型部署教程
  • Swagger 教程(笔记) Knife4j
  • 怎么利用PHP发送彩信
  • layui如何获取当前地址栏的某个参数
  • String类常用的方法
  • linux命令之docker用法
  • uni-app安装插件
  • Rust 运算符快速了解
  • Uniapp时间戳转时间显示/时间格式
  • 每日OJ题_牛客_ 腐烂的苹果_多源BFS_C++_Java
  • 线性判别分析 (LDA)中目标函数两个相似公式 分子 之间的转换过程
  • AUTOSAR汽车电子嵌入式编程精讲300篇-基于CAN总线的气动控制(中)
  • 用 Django 5 快速生成一个简单 进销存 系统 添加 个打印 按钮
  • 10-pg内核之锁管理器(五)行锁
  • python划分CSV格式的数据集
  • 基于Jeecg-boot开发系统--后端篇
  • OpenHarmony(鸿蒙南向)——平台驱动开发【PIN】
  • Linux系统安装和配置 VNC 服务器
  • C语言 | Leetcode C语言题解之第423题从英文中重建数字
  • Trapezoidal Decomposition梯形分解算法(TCD)