最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待。
代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Forms { public partial class Form2 : Form { public Form2() { InitializeComponent(); } CountdownEvent latch ; private void refreshData(CountdownEvent latch) { latch.Signal(); } delegate void UpdateText(Control control, string text); UpdateText color = delegate (Control control, string text) { control.Text = text; }; private void button1_Click(object sender, EventArgs e) { Thread th = new Thread(ProcessMain); th.IsBackground = true; th.Start(); } /// <summary> /// 主线程函数 /// </summary> void ProcessMain() { Process("1"); Process("2"); Process("3"); MessageBox.Show("全部执行完毕"); } /// <summary> /// 动作 /// </summary> void Process(string value) { latch = new CountdownEvent(1); Thread thread = new Thread(() => { bool flag = true; int i = 0; while (flag) { if (i > 99) { flag = false; } i++; Thread.Sleep(10); } refreshData(latch); }); thread.Start(); latch.Wait(); this.Invoke(color, new object[] { textBox1, value }); } } }
多个线程全部执行完毕后再调用方法:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace ExecutionCourseSystem { public partial class Form3 : Form { public Form3() { InitializeComponent(); } CountdownEvent latch = new CountdownEvent(5); private void Form3_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(() => refreshData()); thread.Start(); thread = new Thread(() => refreshData()); thread.Start(); thread = new Thread(() => refreshData()); thread.Start(); thread = new Thread(() => refreshData()); thread.Start(); thread = new Thread(() => refreshData()); thread.Start(); latch.Wait(); MessageBox.Show("线程全部执行完毕"); } private void refreshData() { latch.Signal(); } } }