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

ManualResetEvent 在线程中的使用C#

ManualResetEvent 用于表示线程同步事件,可以使得线程等待信号发射之后才继续执行下一步,否则一直处于等待状态中。

ManualResetEvent 的常用方法

构造函数ManualResetEvent(bool);

ManualResetEvent  manualResetEvent  = new ManualResetEvent(false);
//false  将初始状态设置为无信号
//true   将初始状态设置为有信号

Reset() 复位操作,将状态设置为无信号,如果线程在等待信号的话,那么该线程被阻塞等待。
Set() 设置, 将状态设置为有信号,在等待的线程(可能是一个或多个线程)可以继续执行。

manuaRest.WaitOne() manuaRest.WaitOne(Int32) 有多个重载方法,阻止当前线程,直到收到信号为止。

例子

下面的demo演示了ManualResetEvent 在线程中的简单使用,功能很简单,就是点击开始按钮之后,启动线程,等待线程执行完之后再将结果输出来。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;namespace MutilThRead
{public partial class Form1 : Form{ManualResetEvent manuaRest;Thread tempThread;int Sum;public Form1(){InitializeComponent();Sum = 0;manuaRest = new ManualResetEvent(false);this.Load += new EventHandler(Form1_Load);}private void Form1_Load(object sender, EventArgs e){this.button1.Click += new EventHandler(button1_Click);}/// <summary>/// 开始按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){if(tempThread != null){tempThread = null;}Sum = 0;tempThread = new Thread(ThreadRun);tempThread.Start();   //开始线程manuaRest.Reset();   //进入没有信号状态manuaRest.WaitOne(); //阻塞等待//等待线程执行完  manuaRest.Set()释放信号之后,才会执行后面的代码richTextBox1.Text = Sum.ToString();MessageBox.Show("Sum is " + Sum.ToString());}/// <summary>/// 线程运行/// </summary>private void ThreadRun(){for (int i = 1; i < 10000; i = i*2){Sum += i;Thread.Sleep(100);Console.WriteLine(" Thread execute at {0} ", i.ToString());}manuaRest.Set();  //释放信号,指示等待的线程可以继续往下走}}
}

在这里插入图片描述
ManualResetEvent 是一个非常好用的线程信号源 用于线程上下文同步,还有一个类似的是AutoResetEvent可以在MSDN中查看详情https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.autoresetevent?view=net-8.0

相关文章:

  • 【VTK编译】带PassionReconstruction的编译过程
  • Linux下进程相关概念详解
  • Diffusion Models for Implicit Image Segmentation Ensembles
  • MySQL之索引详解
  • 【RK3288 Android6, T8PRO 快捷按键 gpio 配置上拉输入】
  • ROS从入门到精通4-2:Docker安装ROS、可视化仿真与终端复用
  • 利用MATLAB模拟点电荷的电场分布
  • 通过 python 和 wget 批量下载文件(在Linux/Ubuntu/Debian中测试)
  • C语言深入学习 --- 1.数据的存储
  • 【Apache Camel】基础知识
  • 关于制作一个Python小游戏(三)
  • Batch Nomalization 迁移学习
  • 【框架学习 | 第一篇】一篇文章读懂MyBatis
  • 2024.1.28 校招 实习 内推 面经
  • 【嵌入式——QT】Model/View
  • SegmentFault for Android 3.0 发布
  • @angular/forms 源码解析之双向绑定
  • 【347天】每日项目总结系列085(2018.01.18)
  • docker容器内的网络抓包
  • ESLint简单操作
  • Iterator 和 for...of 循环
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • mysql 数据库四种事务隔离级别
  • oschina
  • php的插入排序,通过双层for循环
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 解析 Webpack中import、require、按需加载的执行过程
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 浏览器缓存机制分析
  • 如何设计一个微型分布式架构?
  • 如何用vue打造一个移动端音乐播放器
  • 微信开放平台全网发布【失败】的几点排查方法
  • 我从编程教室毕业
  • 新书推荐|Windows黑客编程技术详解
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • raise 与 raise ... from 的区别
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #1015 : KMP算法
  • #HarmonyOS:Web组件的使用
  • #Z0458. 树的中心2
  • #在 README.md 中生成项目目录结构
  • $$$$GB2312-80区位编码表$$$$
  • $GOPATH/go.mod exists but should not goland
  • (8)STL算法之替换
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (MATLAB)第五章-矩阵运算
  • (笔试题)分解质因式
  • (分布式缓存)Redis持久化
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)Java算法:二分查找