首页 > 编程语言 >C#ManualResetEvent 在线程中的使用

C#ManualResetEvent 在线程中的使用

时间:2024-04-24 19:34:39浏览次数:26  
标签:C# ManualResetEvent Sum 程中 线程 manuaRest 信号 new

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

ManualResetEvent 的常用方法
构造函数 ManualResetEvent(bool);

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

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

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

例子;
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(); //释放信号,指示等待的线程可以继续往下走 } }
来源:https://blog.csdn.net/weixin_40314351/article/details/136532735

 

标签:C#,ManualResetEvent,Sum,程中,线程,manuaRest,信号,new
From: https://www.cnblogs.com/ywtssydm/p/18156161

相关文章

  • qoj3082 Ascending Matrix 题解
    题目链接点击打开链接题目解法不考虑第\(a_{r,c}=v\)的限制怎么求?我们把条件形式化一下,发现\(k\)个区域的颜色可以表示成轮廓线的形式,即第\(i-1\)条到第\(i\)条轮廓线之间的格点颜色为\(i\)问题变成找到\(k-1\)条互不穿过的路径,起点为\((1,m)\),终点为\((n,1)\)......
  • NumericUpDown 订阅 TextChanged
    NumericUpDownWinForm中NumericUpDown控件的ValueChanged事件是在输入值失去焦点时触发的(NumericUpDown控件失去焦点时会设置Value值从而引发ValueChanged事件)。问题:ValueChanged事件虽然也能做到值改变时的通知但是无法做到在输入的过程中值改变时提供及时的反馈。解......
  • mac柠檬清理
    柠檬清理https://lemon.qq.com/#comparemac软件推荐https://lemon.qq.com/lab/清理扫描......
  • MySQL Error_code: 1756
    电话告警故障:MySQL从库异常宕机。查看MySQLerror日志:[ERROR]SlaveSQLforchannel'':...Theslavecoordinatorandworkerthreadsarestopped,possiblyleavingdataininconsistentstate.Arestartshouldrestoreconsistencyautomatically,althoughusingn......
  • CodeForces 115D Unambiguous Arithmetic Expression
    洛谷传送门CF传送门直接区间dp可以做到\(O(n^3)\),卡常可过,在此就不赘述了。为了方便先把连续的数字缩成一段。我们考虑直接从前往后扫,扫的过程中dp。设\(f_{i,j}\)为考虑了\([1,i]\),还有\(j\)个没配对的左括号的方案数。但是我们发现我们不知道一个数字前要添加几......
  • C++ 多态与虚拟:Class 语法语义
    1.object与class:在object-orientedprogramming编程领域,对象(object)有更严格的定义。对象是由数据结构和用于处理该结构的过程(称为methods)组成的实体(instance)。这些方法由对象接收的消息激活。一个对象的内部数据结构与其他对象完全隔离(此属性称为“encapsulation”)。对象是基于模......
  • 使用pandas高效读取筛选csv数据
    前言在数据分析和数据科学领域中,Pandas是Python中最常用的库之一,用于数据处理和分析。本文将介绍如何使用Pandas来读取和处理CSV格式的数据文件。什么是CSV文件?CSV(逗号分隔值)文件是一种常见的文本文件格式,用于存储表格数据,其中每行表示一条记录,字段之间用逗号或其他......
  • Docker 发布镜像
    在GitHub发布Docker镜像在GitHub上创建一个personalaccesstoken(classic)在DockerCLI中登录到GitHubContainerRegistryexportCR_PAT=YOUR_TOKENecho$CR_PAT|dockerloginghcr.io-uUSERNAME--password-stdin将YOUR_TOKEN和USERNAME替换为你自......
  • JaveScript 入门
    HelloWorld基础知识变量类型booleanLetconstvar数组零开始索引.pop();.push();.length函数constFun=tempC=>{consttempF=tempC*1.8+32;returntempF;}调试console输出console.log();Alertalert("Hi");......
  • RPC请求跟普通Restful请求区别?
    RPC(RemoteProcedureCall,远程过程调用)请求和普通的RESTful请求在设计理念、通信方式、协议等方面有一些区别:设计理念:RPC请求:RPC是一种面向过程的通信模式,其设计目的是让远程调用像本地调用一样简单,它的核心思想是调用远程服务的方法。RESTful请求:RESTful是一种基于资......