[C#] 等待启动的进程执行完毕

有能有时候我们启动了一个进程,必须等到此进程执行完毕,或是,一段时间,

关闭进程后再继续往下走。

Example

sample1

等待应用程序执行完毕

//等待应用程序执行完毕
        private void btnProcessIndefinitely_Click(object sender, EventArgs e) {
            //配置文件案路径
            string target = System.IO.Path.Combine(Application.StartupPath,@"Test.txt");
            //取得完整绝对路径
            target = System.IO.Path.GetFullPath(target);
            //启动进程
            Process p = Process.Start(target);
            //让 Process 组件等候相关的进程进入闲置状态。
            p.WaitForInputIdle();
            //设定要等待相关的进程结束的时间,并且阻止目前的线程执行,直到等候时间耗尽或者进程已经结束为止。
            p.WaitForExit();

            if (p != null) {
                p.Close();
                p.Dispose();
                p = null;
            }

            this.Close();

        }

sample2

等待应用程序(7秒)

//等待应用程序(7秒)
        private void btnWaitProcessfor7_Click(object sender, EventArgs e) {
            //配置文件案路径
            string target = System.IO.Path.Combine(Application.StartupPath, @"Test.txt");
            //取得完整绝对路径
            target = System.IO.Path.GetFullPath(target);
            //启动进程
            Process p = Process.Start(target);
            //让 Process 组件等候相关的进程进入闲置状态。
            p.WaitForInputIdle();
            //设定要等待相关的进程结束的时间,这边设定 7 秒。
            p.WaitForExit(7000);

            //若应用程序在指定时间内关闭,则 value.HasExited 为 true 。
            //若是等到指定时间到了都还没有关闭程序,此时 value.HasExited 为 false,则进入判断式
            if (!p.HasExited) {

                //测试进程是否还有响应
                if (p.Responding) {

                    //关闭用户接口的进程
                    p.CloseMainWindow();

                } else {
                    //立即停止相关进程。意即,进程没回应,强制关闭
                    p.Kill();
                }
            }

            if (p != null) {
                p.Close();
                p.Dispose();
                p = null;
            }

            this.Close();
        }

sample3

使用多线程等候应用程序(7秒)

以上两种方法,在等待进程完成时,窗体画面会 lock 住,无法重绘,这边提供一个改善的方法,

若有其他方法,望前辈指导。

//使用多线程等候应用程序(7秒)
        private void btnMultiThreadWaitProcess_Click(object sender, EventArgs e) {
            //建立线程对象
            Thread thread = new Thread(new ThreadStart(StartProcess));

            //启动线程
            thread.Start();

            //等待线程处理完毕
            while (thread.ThreadState == System.Threading.ThreadState.Running ||
                    thread.ThreadState == System.Threading.ThreadState.WaitSleepJoin) {
                Application.DoEvents();
            }

            this.Close();
        }

        private void StartProcess() {

            //配置文件案路径
            string target = System.IO.Path.Combine(Application.StartupPath, @"Test.txt");
            //取得完整绝对路径
            target = System.IO.Path.GetFullPath(target);
            //启动进程
            Process p = Process.Start(target);

            //让 Process 组件等候相关的进程进入闲置状态。
            p.WaitForInputIdle();
            //设定要等待相关的进程结束的时间,这边设定 7 秒。
            p.WaitForExit(7000);

            //若应用程序在指定时间内关闭,则 value.HasExited 为 true 。
            //若是等到指定时间到了都还没有关闭程序,此时 value.HasExited 为 false,则进入判断式
            if (!p.HasExited) {

                //测试进程是否还有响应
                if (p.Responding) {

                    //关闭用户接口的进程
                    p.CloseMainWindow();

                } else {
                    //立即停止相关进程。意即,进程没回应,强制关闭
                    p.Kill();
                }
            }

            if (p != null) {
                p.Close();
                p.Dispose();
                p = null;
            }
        }     

源代码

TestProcessWaitting.rar

时间: 2024-11-08 21:12:13

[C#] 等待启动的进程执行完毕的相关文章

Java多线程、主线程等待所有子线程执行完毕、共享资源

1.Java创建与启动线程 Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口. 1.1  继承Thread类 public class myThread extends Thread { public void run(){ for(int i=0;i<5;i++){ System.out.println(this.getName()+":"+i); } } public static void main(String[] args){ //

Java多线程--让主线程等待所有子线程执行完毕

数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis()在最后一个子进程结束后记录当前时间,两次一减得到的时间差即为总共的用时,代码如下 Java代码   long tStart = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName() + "开始&

Java主线程等待所有子线程执行完毕再执行解决办法集

Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,比如说主线程要返回一个响应用户的值,但这个值得赋值过程是由过个子线程来完成的(模拟一个实际开发的情景),所以主线程必须等待子线程执行完毕,再响应用户:否则,响应用户的是一个无意义的值. 那么如何确保所有的子线程执行完毕了.一般的有如下方法: 1  让主线程等待,或着睡眠几分钟.用Thread.sleep()或者TimeUnit.SECONDS.sleep(5); 如下: package andy.thread.tradit

java主线程等待所有子线程执行完毕在执行(常见面试题)

java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功,下面就说一下我能想到的方法,欢迎大家批评指正: 用sleep方法,让主线程睡眠一段时间,当然这个睡眠时间是主观的时间,是我们自己定的,这个方法不推荐,但是在这里还是写一下,毕竟是解决方法 2.使用Thread的join()等待所有

Java多线程--让主线程等待所有子线程执行完毕 join

首先从公司一道笔试题开始 1 package test; 2 3 public class Test implements Runnable { 4 5 public int i = 0; 6 7 @Override 8 public void run() { 9 try { 10 Thread.sleep(1000); 11 } catch (InterruptedException e) { 12 // TODO Auto-generated catch block 13 e.printSt

c#等待所有子线程执行完毕方法

原文:c#等待所有子线程执行完毕方法 当我们在使用线程中,你会发现主线结束后子线程的结果才显示出来.现在我要等待所以子线程结束,然后在显示结果,怎么做呢? 方法如下: 1.使用 ManualResetEvent,代码如下:  using System.Threading; namespace ThreadStudy{    /// <summary>    /// 等待所有子线程结束    /// </summary>    class StopAllWaitBySubThread

netframework中等待多个子线程执行完毕并计算执行时间

本文主要描述在.netframework中(实验环境.netframework版本为4.6.1)提供两种方式等待多个子线程执行完毕. ManualResetEvent 在多线程中,将ManualResetEvent实例作为方法传入,线程执行完毕后可以设置标志位来标识当前线程已经执行完毕.代码如下: 1 List<ManualResetEvent> manualResetEvents = new List<ManualResetEvent>(); 2 /// <summary&

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.Thre

python 启动新进程执行脚本

import subprocess p_restart=subprocess.Popen(['/bin/sh','/etc/init.d/xxx_service','reboot']) 原文地址:https://www.cnblogs.com/sea-stream/p/10385358.html