当前位置: 首页 > news >正文

c#让三个线程按照顺序执行

现实的例子

三个线程都是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 对象:ABC,以及一个整型变量 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() 方法,发送信号给第一个任务。

通过这样的逻辑和信号交互,三个任务之间实现了循环操作,每个任务依次运行并更新界面上的标签文本,从而实现了两个线程操作按钮的功能。

 运行截图

http://www.lryc.cn/news/279139.html

相关文章:

  • AWS Directory Service 开启ldaps
  • Seata 以 Nacos 为注册中心启动
  • Unity填坑-灯光烘焙相关
  • 【python】TCP测速程序
  • 新书速览|从零开始大模型开发与微调:基于PyTorch与ChatGLM
  • 边缘计算:连接实时数据的力量与未来发展之路
  • ZooKeeper 实战(四) Curator Watch事件监听
  • Spring Boot 构建工具插件
  • Java集成消息队列Kafka
  • 第十四章JSON
  • 0_项目git地址——正点原子minifly与crazyflie
  • php 字符串常用函数
  • Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2)
  • FlinkOnYarn 监控 flink任务
  • C++内存管理机制(侯捷)笔记1
  • 【论文阅读】Non-blocking Lazy Schema Changes in Multi-Version
  • Rust 最新版1.75.0升级记
  • 使用 KubeSphere 与极狐GitLab 打造云原生持续交付系统
  • EasyExcel的追加写入(新增POI、CSV)
  • JetBrains 开发工具——免费教育许可申请流程
  • 打造高性价比小程序,轻松降低成本
  • mysql 索引优化查询
  • 跟着cherno手搓游戏引擎【4】窗口抽象、GLFW配置
  • Tomcat基础升华学习
  • 一种具有轨迹优化的无人驾驶车实时运动规划器 论文阅读
  • GPDB - 高可用 - 流复制状态
  • 最佳解决方案:如何在网络爬虫中解决验证码
  • 在线项目实习分享:股票价格形态聚类与收益分析
  • c# vb.net检测字符串是否匹配一组相似度数组input Like
  • DEJA_VU3D - Cesium功能集 之 113-获取圆节点(2)