1. 程式人生 > >C# 本進程執行完畢後再執行下一線程

C# 本進程執行完畢後再執行下一線程

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# 本進程執行完畢後再執行下一線程