【C#】 EventWaitHandle的用法

news2024/9/22 6:44:40

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.coloradmin.cn/o/2154478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity数据持久化4——2进制

概述 基础知识 各类型数据转字节数据 文件操作相关 文件相关 文件流相关 文件夹相关 练习题 using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine;public class Exercises1 : MonoBehaviour {/…

金融科技与银行业的数字化转型

随着科技的迅猛发展,金融科技已经成为推动银行业数字化转型的重要力量。从移动支付到区块链,再到人工智能,这些新兴技术正逐渐改变银行的运作方式,不断提高银行的服务效率、提升客户体验,并推动整个金融生态系统的变革…

大数据-143 - ClickHouse 集群 SQL 超详细实践记录!

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

代码编辑器 —— Notepad++ 实用技巧

目 录 NotePad常用技巧一、查找二、标记三、插件四、自动补全 NotePad常用技巧 Notepad 的吉祥物是一只变色龙。它广泛应用于编程、网页开发、文本处理、脚本编写、文档编辑等领域。 一起看看它有哪些功能和特点: 1、对众多编程语言提供语法高亮显示 2、可折叠函数…

redis简单使用与安装

redis redis 是什么 Redis 是一个开源的,使用 C 语言编写的,支持网络交互的,内存中的Key-Value 数据结构存储系统,支持多种语言,它可以用作数据库、缓存和消息中间件。 一、存储系统特性 内存存储与持久化 Redis 主要将数据存储在内存中,这…

某省公共资源交易中心爬虫逆向分析

目标网站 aHR0cHM6Ly95Z3AuZ2R6d2Z3Lmdvdi5jbi8jLzQ0L3NjenQteHEvP3VzZXJJZD02NzM4OTg2MzkyNjA3NzAzMDQmcm93SWQ9NTI1MDYyMDI2ODg0NzE2NTQ0JnRpbWU9MjAwOC0xMS0yNiZjZXJ0aWZpY2F0ZU5vPTkxNDQwOTA0NjgyNDI2MzU4QyZjZXJ0aWZpY2F0ZVR5cGU9Mjg 一、抓包分析 请求头参数加密 二、…

【C语言-数据结构】单链表的定义

单链表的定义(实现) 比较顺序表和单链表的物理存储结构就能够清楚地发现二者的区别 用代码定义一个单链表 typedef struct LNode{ElemType data; //每个结点存放一个数据元素struct LNode* next; //指针指向下一个结点 }LNode, *LinkList;//要表示一个…

微信CRM系统适合什么企业?

CRM(客户关系管理)系统适合多种行业和企业,包括但不限于:传统制造业、互联网行业、电商行业、医疗行业、教育行业、交通运输行业、汽车行业、房地产行业、金融行业、银行 CRM的功能覆盖了与客户接触的各个阶段,包括售…

python --PyAibote自动化

官文: https://www.pyaibote.com/ 下载安卓集成环境: 可以看到开发的一些信息

【AI视频】AI虚拟主播制作网站推荐

一、什么是AI虚拟主播? AI虚拟主播是一种利用人工智能技术打造的虚拟主持人,也被称为数字虚拟主持人。它们通常是由人工智能技术和三维建模技术结合而成,可以在各种平台上进行主持工作,如新闻报道、电商直播、综艺娱乐等。 AI虚…

华润电力最新校招社招润择认知能力测评:逻辑推理数字计算语言理解高分攻略

​ 尊敬的求职者们, 在您准备加入华润电力这个大家庭之前,了解其招聘测评的详细流程和要求是至关重要的。以下是我们为您整理的测评系统核心内容,希望对您的求职之旅有所帮助。 测评系统概览 华润电力的招聘测评系统旨在全面评估求职者的认…

【全网最全】2024年华为杯研赛B题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 点击链接加入【2024华为杯研赛资料汇总】:https://qm.qq.com/q/hMgWngXvcQhttps://qm.qq.com/q/hMgWngXvcQ你是否在寻找数学建模比赛的突破点&a…

二叉树(二)深度遍历和广度遍历

一、层序遍历 广度优先搜索:使用队列,先进先出 模板: 1、定义返回的result和用于辅助的队列 2、队列初始化: root非空时进队 3、遍历整个队列:大循环while(!que.empty()) 记录每层的size以及装每层结果的变量&a…

Linux基础命令以及常识

镜像站点服务器(相当于下载的网址)也可叫软件源 vim /etc/apt/sources.list 索引文件(网络服务器在本地的缓存) 服务器软件源在本地列出来一个清单,以便于主机进行查询操作 cd /var/lib/apt/lists/ 下载软件包默认存放路径 cd /var/cache/a…

Linux_openEuler_24.03部署Oracle 19c部署安装实测验证(无图形桌面-RPM模式)

前言: 近期对openeuler有点兴趣,顺带在做个开发数据仓项目,那就正好安装个环境做个调测,做个记录放上来做个备录给到大家参考。 openEuler 24.03 LTS:四大升级, 首个AI原生开源操作系统正式发布 openEuler …

【医疗大数据】基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析

基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析 1、引言 1-1 医疗大数据的特点 10 V模型:在医疗领域,大数据的特点被描述为10 V,包括价值(Value)、体量(Volume)、速度&#xf…

C语言-文件操作-一些我想到的、见到的奇怪的问题

博客主页:【夜泉_ly】 本文专栏:【C语言】 欢迎点赞👍收藏⭐关注❤️ C语言-文件操作-一些我想到的、见到的奇怪的问题 前言1.在不关闭文件的情况下,连续多次调用 fopen() 打开同一个文件,会发生什么?1.1过…

【linux-Day4】linux的基本指令<下>

【linux-Day4】linux的基本指令<下> linux下的基本指令&#x1f4e2;date&#xff1a;显示时间&#x1f4e2;cal&#xff1a;显示公历日历&#x1f4e2;whereis &#xff1a; 查找指令->可执行文件/源代码/帮助手册所在的位置&#x1f4e2;find &#xff1a;在目录中搜…

C++ | Leetcode C++题解之第424题替换后的最长重复字符

题目&#xff1a; 题解&#xff1a; class Solution { public:int characterReplacement(string s, int k) {vector<int> num(26);int n s.length();int maxn 0;int left 0, right 0;while (right < n) {num[s[right] - A];maxn max(maxn, num[s[right] - A]);i…

色彩管理中的Gamma值的理解

目录 广义的Gamma值为什么要将输出和输入做Gamma运算&#xff1f;显示器的Gamma值什么是Gamma值为1.0线性响应?显示器的Gamma值标准是多少?为什么sRGB在Gamma0.45空间&#xff1f;打印机、印刷机Gamma值?印刷机Gamma与显示器的Gamma的比较参考文章 广义的Gamma值 Gamma值的…