C# 本进程执行完毕后再执行下一线程

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

原文地址:https://www.cnblogs.com/swjian/p/9958937.html

时间: 2024-10-27 06:03:39

C# 本进程执行完毕后再执行下一线程的相关文章

JAVA设计方法思考之如何实现一个方法执行完毕后自动执行下一个方法

今天编程时,突然想起来在一些异步操作或Android原生库的时候,需要我们实现一些方法, 这些方法只需要我们具体实现,然后他们会在适当的时候,自动被调用! 例如AsyncTask,执行玩doInBackground()后会执行处理结果的postResult()方法,但我们并没有设置过他们的执行顺序. 以前只知道他们的运行原理,但不知道具体的实现方法,细想起来,这是一个相当不错的代码设计,所以决定研究一下. 因为一开始是通过实现方法来具体实现那些需要被执行的方法的,所以以为实现的方式是接口, 思索

iOS AFNetWorking中block执行完后再执行其它操作

需求:同时进行两次网络请求,网络请求是异步的,在网络请求成功后进行其它的操作.两个网络请求是这样,一个网络请求中block执行完之后,再进行其它操作,也是一样的原理,只是这时候不需要线程组了,只需要信号量.当然也适用于所有的block. 接下来就说下,在两次异步请求之后要做的操作. 利用线程组和信号量来完成,看代码 - (void)getData { NSString *appIdKey = @"8781e4ef1c73ff20a180d3d7a42a8c04"; NSString*

线程池: 等待线程池内所有线程执行完毕后再继续任务

boolean loop = true; do{ loop=!executorService.awaitTermination(2, TimeUnit.SECONDS); }while(loop);

用一个bat文件调用另外两个bat文件,当1.bat执行完后再执行2.bat

摘自:https://zhidao.baidu.com/question/492732911.html @echo off start d:\1.bat start c:\2.bat 这样是2个任务同时执行,应该怎么改,谢谢 1 2 3 4 5 6 7 8 9 @echo off start /wait d:\1.bat start /wait c:\2.bat   @echo off call d:\1.bat call c:\2.bat start 是在新窗口运行调用的文件,call是在当前

main函数执行前、后再执行的代码

一.main结束 不代表整个进程结束  (1)全局对象的构造函数会在main 函数之前执行,          全局对象的析构函数会在main函数之后执行:          用atexit注册的函数也会在main之后执行.  (2)一些全局变量.全局对象和静态变量.对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间.释放资源使用权等操作  (3)进程启动后,要执行一些初始化代码(如设置环境变量等),然后跳转到main执行.全局对象的构造也在ma

使用ajax后提交事件后禁用按钮,事件执行完毕后,重新启用按钮

一直想做这样的效果,实现的方法虽然不是很好,但效果还是出来了 <script runat="server"> /// <summary> /// 当Button2被点击,实际是Button3触发事件,这样就可以达到提交事件时禁用被提交的按钮效果 /// </summary> protected void Button_Click(object sender, EventArgs e) { System.Threading.Thread.Sleep(5

C# 多线程join的用法,等待多个子线程结束后再执行主线程

等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = new Thread[2]; ths[0] = new Thread(Method1); ths[1] = new Thread(Method2); foreach (Thread item in ths) { //首先让所有线程都启动 item.Start(); //试想一下在这里加上item.

java并发编程学习:如何等待多个线程执行完成后再继续后续处理(FutureTask、synchronized、CyclicBarrier)

多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的static变量,假如有10个线程,每个线程处理完上去累加下结果,然后后面用一个死循环(或类似线程阻塞的方法),去数这个结果,达到10个,说明大家都爽完了,可以进行后续的事情了,这个想法虽然土鳖,但是基本上跟语言无关,几乎所有主流编程语言都支持. package yjmyzz.test; publi

用dispatch组让下一个操作在当前操作完成后再执行,即同步操作

创建dispatch组 dispatch_group_t group = dispatch_group_create(); 手动管理group关联的block的运行状态(或计数),进入和退出group次数必须匹配 dispatch_group_enter(group); dispatch_group_leave(group); 当group关联的block执行完毕后,就调用这个block.类似dispatch_barrier_async. dispatch_group_notify(group,