C# 本程序執行完畢後再執行下一執行緒
阿新 • • 發佈:2018-11-14
最近做了一套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; usingSystem.Windows.Forms; namespace ExecutionCourseSystem { public partial class Form3 : Form { public Form3() { InitializeComponent(); } CountdownEvent latch = new CountdownEvent(1); 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() { Process1(); Process2(); Process3(); } /// <summary> /// 動作1 /// </summary> void Process1() { latch = new CountdownEvent(1); Thread thread = new Thread(() => { bool flag = true; int i = 0; while (flag) { if (i > 99) { flag = false; } i++; Thread.Sleep(50); } refreshData(latch); }); thread.Start(); latch.Wait(); this.Invoke(color, new object[] {textBox1, "1" }); } /// <summary> /// 動作2 /// </summary> void Process2() { latch = new CountdownEvent(1); Thread thread = new Thread(() => { bool flag = true; int i = 0; while (flag) { if (i > 99) { flag = false; } i++; Thread.Sleep(50); } refreshData(latch); }); thread.Start(); latch.Wait(); this.Invoke(color, new object[] { textBox1, "2" }); } /// <summary> /// 動作3 /// </summary> void Process3() { latch = new CountdownEvent(1); Thread thread = new Thread(() => { bool flag = true; int i = 0; while (flag) { if (i > 99) { flag = false; } i++; Thread.Sleep(50); } refreshData(latch); }); thread.Start(); latch.Wait(); this.Invoke(color, new object[] { textBox1, "3" }); } } }
多個執行緒全部執行完畢後再呼叫方法:
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(); } } }