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

C#中EventWaitHandle的使用小结

深入介绍EventWaitHandleEventWaitHandle是 .NET 中一个用于线程同步的基类位于System.Threading命名空间下。它提供了一种机制用于一个或多个线程等待某个特定事件的发生通常用于多线程同步和线程间的通信。EventWaitHandle类本身是一个抽象类不能直接实例化但它有两个常见的子类——AutoResetEvent和ManualResetEvent这两个子类广泛用于线程同步操作。1.EventWaitHandle基本概念与功能EventWaitHandle 是一种线程同步机制它使得线程能够根据特定事件的状态信号或非信号来决定是否继续执行。通常线程在执行过程中会检查事件的状态若事件处于非信号状态线程会被挂起直到事件状态变为信号状态。EventWaitHandle 可以在两个主要的状态之间切换信号状态表示事件已经触发等待的线程可以继续执行。非信号状态表示事件未触发等待的线程会被阻塞直到事件变为信号状态。常见操作方法Set()将事件的状态设置为信号状态允许所有等待的线程继续执行。Reset()将事件的状态设置为非信号状态阻止所有等待线程继续执行直到事件状态再次被触发。WaitOne()使当前线程等待直到事件的状态变为信号状态。线程如果发现事件是非信号状态它会被阻塞直到事件变为信号状态。2.EventWaitHandle的实现机制EventWaitHandle 是由操作系统支持的同步对象通常通过系统级别的信号机制来实现。其工作原理主要包括信号和无信号状态EventWaitHandle 管理一个信号和非信号的状态。线程通过 WaitOne() 等待事件变为信号状态而 Set() 方法将事件的状态设置为信号状态解除线程的阻塞。线程阻塞当线程调用 WaitOne() 方法时若事件处于无信号状态线程会被阻塞直到 Set() 方法被调用事件状态变为信号状态线程才能继续执行。事件复位机制自动复位对于 AutoResetEvent 类事件会在释放一个等待线程后自动返回到无信号状态。适用于需要逐个释放线程的情况。手动复位对于 ManualResetEvent 类事件保持信号状态直到手动调用 Reset()。这适用于需要多个线程同时释放的场景。3.EventWaitHandle的常用子类(1)AutoResetEventAutoResetEvent 是 EventWaitHandle 的一个子类。它的特点是事件在信号状态下会在释放一个等待的线程后自动回到无信号状态。每次信号事件被触发时只有一个线程会被唤醒并执行然后事件会自动复位。使用场景单线程等待AutoResetEvent 适用于需要单个线程继续执行的场景。每次事件被设置为信号状态后只有一个线程会被唤醒并继续执行。生产者-消费者模式适用于多个消费者线程处理来自生产者线程的数据确保每次只允许一个消费者处理数据。示例代码1234567891011121314151617181920212223242526272829303132usingSystem;usingSystem.Threading;classProgram{staticAutoResetEvent autoResetEvent newAutoResetEvent(false);staticvoidMain(){// 启动多个线程for(inti 0; i 3; i){intthreadId i;newThread(() {Console.WriteLine($Thread {threadId} is waiting...);autoResetEvent.WaitOne();// 等待信号Console.WriteLine($Thread {threadId} is proceeding after signal.);}).Start();}// 主线程模拟工作并发出信号Thread.Sleep(2000);Console.WriteLine(Main thread is signaling...);// 每次调用 Set() 唤醒一个线程for(inti 0; i 3; i){autoResetEvent.Set();// 唤醒一个线程}}}解释主线程调用autoResetEvent.Set()每次触发信号后只有一个等待的线程会被唤醒。线程在等待信号时使用WaitOne()方法如果事件未触发它将阻塞直到事件状态变为信号。(2)ManualResetEventManualResetEvent是EventWaitHandle的另一种子类。与AutoResetEvent不同ManualResetEvent在调用Set()后保持信号状态直到显式调用Reset()来恢复为无信号状态。这意味着多个线程可以同时继续执行直到事件被重置。使用场景多线程同时启动多个线程可以在信号状态下同时继续执行。适用于所有线程必须在某个时刻开始执行的场景。批处理操作当多个线程的执行依赖于某个条件时可以使用ManualResetEvent等待某个条件达成后再同时启动多个线程。示例代码1234567891011121314151617181920212223242526272829usingSystem;usingSystem.Threading;classProgram{staticManualResetEvent manualResetEvent newManualResetEvent(false);staticvoidMain(){// 启动多个工作线程for(inti 0; i 3; i){intthreadId i;newThread(() {Console.WriteLine($Thread {threadId} is waiting...);manualResetEvent.WaitOne();// 等待信号Console.WriteLine($Thread {threadId} is proceeding after signal.);}).Start();}// 主线程等待 2 秒模拟一些工作Thread.Sleep(2000);Console.WriteLine(Main thread is signaling...);// 设置信号状态允许所有线程继续manualResetEvent.Set();}}解释在主线程调用Set()后所有等待的线程都会继续执行直到Reset()被调用。与AutoResetEvent不同ManualResetEvent会保持信号状态直到显式地调用Reset()来使其变为无信号状态。4.EventWaitHandle和其子类的适用场景特性AutoResetEventManualResetEvent复位机制自动复位释放一个等待线程后自动重置为无信号状态手动复位信号状态保持直到显式调用 Reset()适用场景单线程等待每次仅唤醒一个线程多线程等待可以唤醒多个线程线程释放只释放一个线程可以释放多个线程线程阻塞线程阻塞直到事件变为信号状态线程阻塞直到事件变为信号状态且多个线程可以并发执行选择指南使用 AutoResetEvent适用于逐个释放线程的场景如生产者-消费者模型中的消费者线程或者线程需要按顺序依次执行的情况。使用 ManualResetEvent适用于一次性释放多个线程的场景例如所有线程等待某个条件的达成或者你希望多个线程同时执行某个任务。
http://www.zskr.cn/news/1364902.html

相关文章:

  • C#删除文件夹里的所有文件的实现方案
  • 使用C#实现隐藏Excel单个和多个工作表的示例详解
  • 食品安全总监考试报名方式有哪些,考试难度如何,难度变化大吗 - myqiye
  • KOSS模型:卡尔曼滤波与深度学习的融合创新
  • 实战:用密度峰值聚类(DPC)算法处理你的第一份复杂形状数据集(附完整Python代码与可视化)
  • 为什么 Multi-Agent 一定要测“失败率”而不是“成功率”
  • 从One-Hot到BERT:用Python代码复现NLP词向量演进的5个关键阶段
  • 告别Kali?Parrot安全系统实战初体验与渗透测试工作流迁移指南
  • 小红书视频下载神器:3分钟掌握无水印批量下载技巧
  • 小红书下载器突破反爬:7个User-Agent伪装技巧与实战指南
  • 能源AI Agent不是“加个模型”:20年工控系统老兵手绘7层可信执行栈,含硬件级TEE加固方案
  • 告别‘软件荒’?实测openKylin应用商店与安卓App兼容,看国产系统生态现状
  • 推荐靠谱的火锅串串培训机构,想做川味火锅串串的看过来 - mypinpai
  • 如何用Zotero-GPT插件实现AI驱动的智能文献管理:终极指南
  • JMeter压测5大底层优化:线程模型、HTTP连接、Groovy脚本、JVM参数与分布式协同
  • JMeter梯度压测:精准定位系统可扩展性边界
  • XHS-Downloader:小红书内容采集与管理的技术实践
  • CentOS 7上安装Containerd:YUM和二进制包两种方法,到底哪个更适合你?
  • 机器学习预测因果边界:从数据稀缺子群体到精准决策
  • 水草治理公司口碑如何?荷之源口碑出众 - mypinpai
  • Keras图像分类混淆矩阵实战:从原理到调优的完整指南
  • Unity触摸交互优化:TouchScript跨平台手势架构解析
  • 汽车玻璃贴膜哪个好,揭秘高性价比汽车贴膜品牌及价格 - mypinpai
  • 浏览器变身微信客户端:wechat-need-web插件颠覆你的聊天体验
  • 3分钟解锁网易云音乐加密文件:NCMDump黑科技全攻略
  • C# Task异步编程的实现示例
  • 阴阳师自动化脚本:如何用智能技术解放你的游戏时间
  • 终极指南:快速重置JetBrains IDE试用期的完整方案
  • CVE-2016-2183漏洞深度解析:Sweet32攻击与3DES禁用实战
  • 猫抓浏览器扩展:3步轻松捕获网页视频资源,让在线内容触手可及