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

浅谈C#之AutoResetEvent和ManualResetEvent

一、基本介绍

  AutoResetEventManualResetEvent都是同步原语,它们用于线程之间的协调和通信。它们都是从EventWaitHandle类派生的,但它们在重置事件状态的行为上有所不同。

二、简单示例

AutoResetEvent

AutoResetEvent是一个自动重置的事件。当一个线程调用Set方法后,任何等待该事件的线程都会被释放,然后事件会自动回到非信号状态(即,它会自动重置)。这意味着如果只有一个线程在等待,那么这个线程会被释放,如果有更多的线程在等待,那么只有一个线程会被释放,其余的线程会继续等待。

using System.Threading;class Program
{static AutoResetEvent autoEvent = new AutoResetEvent(false);static void Main(){Thread t = new Thread(DoWork);t.Start();autoEvent.WaitOne(); // 等待事件被设置Console.WriteLine("Main thread is now free to exit.");}static void DoWork(){Console.WriteLine("Worker thread is working.");autoEvent.Set(); // 设置事件,释放等待的线程}
}

ManualResetEvent

ManualResetEvent是一个手动重置的事件。与AutoResetEvent不同,当一个线程调用Set方法后,所有等待该事件的线程都会被释放,但是事件不会自动重置,它将保持在信号状态,直到调用Reset方法。这意味着如果有更多的线程在等待,那么所有等待的线程都会被释放。

using System.Threading;class Program
{static ManualResetEvent manualEvent = new ManualResetEvent(false);static void Main(){Thread t = new Thread(DoWork);t.Start();manualEvent.WaitOne(); // 等待事件被设置Console.WriteLine("Main thread is now free to exit.");}static void DoWork(){Console.WriteLine("Worker thread is working.");manualEvent.Set(); // 设置事件,释放等待的线程}
}

三、使用场景

  • AutoResetEvent:当你希望每次只有一个等待线程被释放时使用。
  • ManualResetEvent:当你希望所有等待线程都被释放时使用,或者你需要在多个地方重置事件状态时使用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 第k个排列 - 华为OD统一考试(E卷)
  • Java学习路线
  • 51单片机 - DS18B20实验1-读取温度
  • 浏览器指纹修改指南2024 - CommandLine(一)
  • 速盾:h5小游戏需要开cdn吗?
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • 腾讯百度阿里华为常见算法面试题TOP100(3):链表、栈、特殊技巧
  • 基于C++实现(MFC)职工工作量统计系统
  • Android OkHttp源码分析(一):为什么OkHttp的请求速度很快?为什么可以高扩展?为什么可以高并发
  • Python 集成快递物流 API 助力订单追踪:轻松实现物流可视化
  • 如何让Windows控制台窗口不接受鼠标点击(禁用鼠标输入)
  • 面试真题-TCP的三次握手
  • 线性基速通
  • 【STM32】独立看门狗(IWDG)原理详解及编程实践(上)
  • OpenCV-模板匹配多个目标
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【Linux系统编程】快速查找errno错误码信息
  • 【个人向】《HTTP图解》阅后小结
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • IDEA常用插件整理
  • JavaScript服务器推送技术之 WebSocket
  • Java小白进阶笔记(3)-初级面向对象
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • REST架构的思考
  • springboot_database项目介绍
  • 电商搜索引擎的架构设计和性能优化
  • 后端_ThinkPHP5
  • 计算机常识 - 收藏集 - 掘金
  • 你不可错过的前端面试题(一)
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 用 Swift 编写面向协议的视图
  • 函数计算新功能-----支持C#函数
  • 数据可视化之下发图实践
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • (42)STM32——LCD显示屏实验笔记
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (含笔试题)深度解析数据在内存中的存储
  • (七)Knockout 创建自定义绑定
  • (算法)大数的进制转换
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .gitignore文件---让git自动忽略指定文件
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET MVC之AOP
  • .Net 代码性能 - (1)
  • .NET 给NuGet包添加Readme
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET/C# 使用反射注册事件
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .so文件(linux系统)
  • :中兴通讯为何成功
  • @Bean, @Component, @Configuration简析