最近做了一套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(); } } }