现实的例子
三个线程都是while(true)的循环体
A线程:采集数据
B线程:画曲线
C线程:存数据库
AutoResetEvent类 
 
AutoResetEvent是一个线程同步的类,它提供了一种机制,允许一个或多个线程等待直到接收到信号,然后继续执行。以下是
AutoResetEvent的一些常用成员:
WaitOne():使当前线程等待接收信号。如果没有收到信号,则当前线程将被阻塞,直到接收到信号。
Set():发送信号,唤醒一个正在等待的线程。如果没有线程在等待,下一个调用WaitOne()的线程将立即被唤醒。
Reset():重置事件状态,将其设置为非终止状态。AutoResetEvent类在调用Set()方法后会自动调用Reset()方法将事件状态重置为非终止状态。
代码
public partial class Form4 : Form{AutoResetEvent A;AutoResetEvent B;AutoResetEvent C;int a;public Form4(){InitializeComponent();A = new AutoResetEvent(false);B = new AutoResetEvent(false);C = new AutoResetEvent(false);Task.Factory.StartNew(() =>{for (int i = 0; i < 100; i++){A.WaitOne();Invoke(new Action(() => label1.Text = i.ToString()));Thread.Sleep(500);B.Set();}});Task.Factory.StartNew(() =>{for (int i = 0; i < 100; i++){B.WaitOne();Invoke(new Action(() => label2.Text = i.ToString()));Thread.Sleep(500);C.Set();}});Task.Factory.StartNew(() =>{for (int i = 0; i < 100; i++){C.WaitOne();Invoke(new Action(() => label3.Text = i.ToString()));Thread.Sleep(500);A.Set();}});}private void button1_Click(object sender, EventArgs e){A.Set();}}这段代码演示了如何使用
AutoResetEvent实现两个线程操作按钮的功能。首先,在
Form4类中定义了三个AutoResetEvent对象:A、B和C,以及一个整型变量a。然后在构造函数中初始化这些对象。接下来,通过使用
Task.Factory.StartNew()方法创建三个任务,并在每个任务内部编写逻辑。第一个任务使用
for循环来迭代 100 次。在每次循环中,它调用A.WaitOne()方法等待信号,然后使用Invoke()方法将计数值赋值给label1.Text属性,并在界面上显示出来。然后线程休眠 500 毫秒,并通过B.Set()方法发送信号给第二个任务。第二个任务也使用
for循环来迭代 100 次,类似于第一个任务。它调用B.WaitOne()方法等待信号,然后使用Invoke()方法将计数值赋值给label2.Text属性,并在界面上显示出来。然后线程休眠 500 毫秒,并通过C.Set()方法发送信号给第三个任务。第三个任务同样使用
for循环来迭代 100 次,类似于前两个任务。它调用C.WaitOne()方法等待信号,然后使用Invoke()方法将计数值赋值给label3.Text属性,并在界面上显示出来。然后线程休眠 500 毫秒,并通过A.Set()方法发送信号给第一个任务。最后,在界面上有一个按钮
button1,当点击按钮时,会调用A.Set()方法,发送信号给第一个任务。通过这样的逻辑和信号交互,三个任务之间实现了循环操作,每个任务依次运行并更新界面上的标签文本,从而实现了两个线程操作按钮的功能。
运行截图
