C# ManualResetEvent‌的高级用法

一、ManualResetEvent 的核心作用‌

ManualResetEvent 是 C# 中用于 ‌线程同步‌ 的类(位于 System.Threading 命名空间),通过信号机制控制线程的等待与执行。其核心功能包括:

  • 阻塞线程‌:调用 WaitOne() 的线程会等待,直到事件被触发(信号状态)。
  • 手动控制信号‌:通过 Set() 发送信号释放所有等待线程,Reset() 重置为非信号状态。

‌二、基本用法‌

  1. ‌初始化‌
// 初始化时指定初始状态(true:已触发,false:未触发)
ManualResetEvent resetEvent = new ManualResetEvent(false);
  1. ‌阻塞线程(等待信号)‌
// 阻塞当前线程,直到收到信号或超时
bool signaled = resetEvent.WaitOne();              // 无限等待
bool signaled = resetEvent.WaitOne(3000);          // 等待3秒
bool signaled = resetEvent.WaitOne(TimeSpan.FromSeconds(3)); // 同上
  1. ‌发送信号‌
resetEvent.Set();   // 触发事件,释放所有等待线程
  1. ‌重置信号‌
resetEvent.Reset(); // 重置为非触发状态

‌三、典型场景‌

  1. ‌多线程任务协调‌
    多个线程等待某个操作完成后继续执行:
ManualResetEvent event = new ManualResetEvent(false);void ThreadWork()
{Console.WriteLine("线程等待中...");event.WaitOne();  // 阻塞直到事件触发Console.WriteLine("线程继续执行");
}// 启动多个线程
new Thread(ThreadWork).Start();
new Thread(ThreadWork).Start();Thread.Sleep(2000);
event.Set();  // 释放所有线程
  1. ‌异步操作完成通知‌
    主线程等待异步任务完成:
ManualResetEvent doneEvent = new ManualResetEvent(false);void AsyncOperation()
{Thread.Sleep(3000); // 模拟耗时操作doneEvent.Set();     // 标记完成
}new Thread(AsyncOperation).Start();
doneEvent.WaitOne();     // 主线程等待Console.WriteLine("异步操作完成");
  1. ‌超时控制‌
    限制操作的执行时间:
ManualResetEvent timeoutEvent = new ManualResetEvent(false);void LongRunningTask()
{Thread.Sleep(5000); // 模拟耗时操作timeoutEvent.Set();  // 完成后触发事件
}new Thread(LongRunningTask).Start();// 等待最多3秒
if (!timeoutEvent.WaitOne(3000))
{Console.WriteLine("操作超时");
}
else
{Console.WriteLine("操作正常完成");
}

‌四、与 AutoResetEvent 的区别‌

特性ManualResetEventAutoResetEvent
‌信号触发后状态‌保持触发状态,需手动重置自动重置为非触发状态
‌释放线程数‌释放所有等待线程仅释放一个等待线程
‌典型场景‌多线程同时启动、任务协调单次信号通知(如生产者-消费者)

‌五、最佳实践‌

‌使用 using 释放资源‌
实现 IDisposable,确保释放内核资源:

using (ManualResetEvent resetEvent = new ManualResetEvent(false))
{// 操作...
}

‌避免死锁‌

确保在所有可能的代码路径中调用 Set(),避免线程永久阻塞。
结合 try-finally 处理异常:

try
{// 代码...
}
finally
{resetEvent.Set();
}

‌超时设置‌
始终为 WaitOne() 指定合理的超时时间,防止线程无限等待:

if (!resetEvent.WaitOne(5000))
{throw new TimeoutException("等待超时");
}

‌替代方案‌
在 .NET 4.0+ 中,优先使用 Task 和 CancellationToken 实现异步控制:

var cts = new CancellationTokenSource();
Task.Run(() => LongMethod(cts.Token), cts.Token);if (!task.Wait(3000))
{cts.Cancel();Console.WriteLine("任务超时终止");
}

六、常见问题‌

‌Q:为什么调用 Set() 后线程未继续执行?‌

  • 原因‌:可能忘记调用 Reset(),导致后续 WaitOne() 直接通过。
  • ‌解决‌:在需要重新等待时调用 Reset()。
    ‌Q:多次调用 Set() 是否有副作用?‌
  • ‌答案‌:无。多次调用 Set() 等效于一次调用(事件保持触发状态)。

‌七、总结‌

  • ‌核心用途‌:实现多线程间的精确协调和同步。
  • ‌适用场景‌:需要手动控制信号状态的线程阻塞与释放(如批量任务启动、超时控制)。
  • 替代方案‌:在异步编程中,优先使用 Task、SemaphoreSlim 或 Barrier

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35344.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践1. 成本构成分析与优化机会识别1.1 Serverless模式成本分布1.2 冷热数据特征分析数据特征矩阵 2. 冷热数据…

安卓edge://inspect 和 chrome://inspect调试移动设备上的网页

edge://inspect 和 chrome://inspect 是用于调试浏览器中运行的网页和移动设备上的网页的工具。这两个工具分别属于 Microsoft Edge 和 Google Chrome 浏览器。以下是它们的详细介绍: chrome://inspect 如果是直接使用数据线调试,则只需要执行下面的第一…

checkpoint机制

1、什么是checkpoint 将缓冲池中的脏页刷新到磁盘,并更新redo log的checkpoint位点,确保数据库在发生故障时可以快速恢复到一致的状态。 2、checkpoint执行过程 确保需要刷新的脏页:从缓冲池中选取一部分需要刷新的页数据页刷新&#xff1…

【微服务日志收集①】使用FileBeat+Logstash+ES搭建ELK日志系统

使用FileBeatLogstashES搭建ELK日志系统,架构图如下: 1、 使用docker快速创建ES服务和Kibana服务 前置条件:需要在linux上提前安装好docker和docker-compose 1.1、在linux创建好一个用于存放docker-compose配置文件的文件夹 我的目录是/app/…

Centos 7 安装达梦数据库

一、环境准备 1. 确认操作系统的版本和数据库的版本是否一致 cat /etc/redhat-release 2. 关闭防火墙 查看防火墙状态 firewall-cmd --state 停止firewall systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.service 3. 修改文件l…

仿“东方甄选”直播商城小程序运营平台

在公域直播流量红利趋于饱和、流量成本大幅攀升的当下,私域直播为企业开辟了新的流量聚集和转化渠道,特别是对于那些希望在私域流量领域取得突破的品牌商家来说,直播场景以其独特的高频互动氛围,相比其他运营方式,展现…

ZED X系列双目3D相机的耐用性与创新设计解析

在工业自动化和学术研究领域,高精度的视觉设备正成为提升效率和质量的关键。ZED X系列AI立体相机,凭借其先进的技术和耐用的设计,为这一领域带来了新的可能。 核心技术:深度感知与精准追踪 ZED X系列的核心技术之一是Neural Dept…

Cursor的使用感受,帮你使用好自动化编程工具,整理笔记

使用感受 说实话,我觉得cursor还是好用的,可能我刚开始使用,没有使用的非常的熟练,运用也没有非常的透彻,总体体验还是不错的,在使用它时,我优先考虑,前端页面功能复用的时候&#…

《C#上位机开发从门外到门内》3-5:基于FastAPI的Web上位机系统

文章目录 一、项目概述二、系统架构设计三、前后端开发四、数据可视化五、远程控制六、系统安全性与稳定性七、性能优化与测试八、实际应用案例九、结论 随着互联网技术的快速发展,Web上位机系统在工业自动化、智能家居、环境监测等领域的应用日益广泛。基于FastAPI…

vue3单独引用element-plus的Infinite Scroll无限滚动;vue3自定义指令

文章目录 1.正常单独使用element-plus其他功能组件2.引入类似与指令的插件3.自定义指令钩子 1.正常单独使用element-plus其他功能组件 引入即可使用 import { ElSelect, ElOption } from "element-plus"2.引入类似与指令的插件 需要先引入,再注册&…

CMake学习笔记(二):变量设值,源文件/文件查找

一_变量设值: 在上一节中我们知道了如何去链接起来多个源文件并且生成可执行文件&#xff0c;但是当我们的源文件过多的时候会导致我们在add_executable里面写很长的一串&#xff0c;所以我们可以使用变量来进行设值: set(<variable> <value>... [PARENT_SCOPE])…

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 【Function】Azure Function通过托管身份或访问令牌连接Azu…

案例5_1:单位数码管显示0

文章目录 文章介绍效果图仿真图5_1放置单位数码管 代码5_1.c 文章介绍 效果图 仿真图5_1 复制案例1_2的仿真图&#xff0c;在此基础上修改 注意&#xff1a;栅格大小需要缩小 放置单位数码管 代码5_1.c #include <reg52.h>#define uchar unsigned char #define uint un…

helm部署metricbeat

背景 在Elastic Stack 7.5版本之前&#xff0c;系统默认采用内置服务进行监控数据采集&#xff08;称为内部收集机制&#xff09;&#xff0c;这种设计存在显著局限性&#xff1a; 当ES集群崩溃时自带的节点监控也会随之崩溃&#xff0c;直到集群恢复前&#xff0c;崩溃期间的…

基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)

1. 前言 在数据分析和网络爬虫的应用场景中&#xff0c;我们经常需要获取社交媒体平台的数据&#xff0c;例如 TikTok。本篇文章介绍如何使用 Python 爬取 TikTok 用户搜索数据&#xff0c;并解析其返回的数据。 结果截图 2. 项目环境准备 在正式运行代码之前&#xff0c;我…

阿里云、腾讯云云主机如何提升远程桌面安全(VNC登录)

远程桌面连接&#xff08;RDP&#xff09;是管理主机的常用方式&#xff0c;但同时也带来了安全风险。黑客会对远程桌面进行暴力破解攻击和撞库攻击。作为云主机&#xff0c;在远程桌面方面有天然的安全优势&#xff1a;可以关闭远程桌面服务或端口&#xff0c;限制只能通过网页…

【etcd】

一、ETCD 简介 etcd是一个由CoreOS团队开发的开源项目&#xff0c;旨在提供一个高可用的、分布式的、一致的键值存储&#xff0c;用于配置共享和服务发现。尽管它看起来像一个键值存储&#xff0c;但etcd的设计目标远远超出了传统数据库的功能范围。 etcd的核心特性包括&…

深圳南柯电子|医疗设备EMC检测测试整改:保障患者安全的第一步

在医疗设备领域&#xff0c;电磁兼容性&#xff08;EMC&#xff09;是确保设备安全、有效运行的关键指标。随着医疗技术的飞速发展&#xff0c;医疗设备日益复杂&#xff0c;其电磁环境也愈发复杂多变。EMC检测测试及整改因此成为医疗设备研发、生产、销售过程中不可或缺的一环…

项目实战系列:基于瑞萨RA6M5构建多节点OTA升级-系统设计<一>

项目背景 原嵌入式控制系统采用分布式模块化架构&#xff0c;由12个功能板卡&#xff08;通信控制、信号采集、驱动执行等&#xff09;组成。系统维护阶段存在以下痛点&#xff1a; 低效的本地烧录机制&#xff1a;各板卡固件升级需通过JTAG接口逐一手动连接JLINK仿真器&#x…

五大方向全面对比 IoTDB 与 OpenTSDB

对比系列第三弹&#xff0c;详解 IoTDB VS OpenTSDB&#xff01; 之前&#xff0c;我们已经深入探讨了时序数据库 Apache IoTDB 与 InfluxDB、Apache HBase 在架构设计、性能和功能方面等多个维度的区别。还没看过的小伙伴可以点击阅读&#xff1a; Apache IoTDB vs InfluxDB 开…