线程同步 - 信号同步 -ManualResetEvent
将 AutoResetEvent
改为 ManualResetEvent
后,执行效果变为新起的两个线程都阻塞,收到信号后都继续执行。但是再次新起线程后,两个线程都没有阻塞。
cs
using System;
using System.Threading;
using System.Windows.Forms;
namespace WaitHandleSample
{
public partial class Form3 : Form
{
ManualResetEvent manualesetEvent = new ManualResetEvent(false);
public Form3()
{
InitializeComponent();
// 允许新线程访问主线程的控件
CheckForIllegalCrossThreadCalls = false;
}
private void btnStartAThread_Click(object sender, EventArgs e)
{
StartThread1();
StartThread2();
}
private void StartThread1()
{
Thread tWork1 = new Thread(() => {
label1.Text = "线程 1 启动。。。" + Environment.NewLine;
label1.Text += "开始处理一下实际的工作" + Environment.NewLine;
// 省略工作代码
label1.Text += "我开始等待别的线程给我信号,才愿意继续下去" + Environment.NewLine;
manualesetEvent.WaitOne();
label1.Text += "我继续做了一些工作,然后结束了";
});
tWork1.IsBackground = true;
tWork1.Start();
}
private void StartThread2()
{
Thread tWork2 = new Thread(() => {
label2.Text = "线程 2 启动。。。" + Environment.NewLine;
label2.Text += "开始处理一下实际的工作" + Environment.NewLine;
// 省略工作代码
label2.Text += "我开始等待别的线程给我信号,才愿意继续下去" + Environment.NewLine;
manualesetEvent.WaitOne();
label2.Text += "我继续做了一些工作,然后结束了";
});
tWork2.IsBackground = true;
tWork2.Start();
}
private void btnSet_Click(object sender, EventArgs e)
{
// 给在 autoResetEvent 上等待的线程一个信号
manualesetEvent.Set();
}
}
}