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