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