C# 本進程執行完畢後再執行下一線程
阿新 • • 發佈:2018-11-14
pda lag initial process orm threading 監聽 message tasks
最近做了一套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 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(); } } }
C# 本進程執行完畢後再執行下一線程