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

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

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

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

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

    数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis() ...

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

    java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个 ...

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

    本文主要描述在.netframework中(实验环境.netframework版本为4.6.1)提供两种方式等待多个子线程执行完毕. ManualResetEvent 在多线程中,将ManualRes ...

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

    当我们在使用线程中,你会发现主线结束后子线程的结果才显示出来.现在我要等待所以子线程结束,然后在显示结果,怎么做呢? 方法如下: 1.使用 ManualResetEvent,代码如下:  using  ...

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

    最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待. 代码: using System; using Sys ...

  6. Java主线程等待所有子线程执行完毕再执行解决办法(转)

    方法一: Thread.join()方法,亲测可行,thread.join()方法 Vector<Thread> ts = new Vector<Thread>(); for  ...

  7. python 启动新进程执行脚本

    import subprocess p_restart=subprocess.Popen(['/bin/sh','/etc/init.d/xxx_service','reboot'])

  8. CountDownLatch用法---等待多个线程执行完才执行

    CountDownLatch用法---等待多个线程执行完才执行 CountDownLatch用法---等待多个线程执行完才执行 CountDownLatch用法---等待多个线程执行完才执行 Coun ...

  9. C#winform调用外部程序,等待外部程序执行完毕才执行下面代码

    1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 System.Diagnostics.Process.Start(“应用程序文件全路径”); 2.如果要等待调用外部程序执行完毕 ...

随机推荐

  1. QListWidgetItem的图片大小问题

    图片的大小是由listWidget的setIconSize设定的,而不是ListWidgetItem的SetIcon设定的

  2. 【linux】打包压缩命令

    打包命令:tar\zip 压缩命令:gzip 打包文件 tar -zcvf xxx/ tar -xvf xxx.tar z的意思是通过gzip压缩 c是create是生成打包的意思,x是解包 v是压缩 ...

  3. js 函数里的 this

    1,当作为纯粹的函数调用时, this指向调用出的环境的上下文,看下面的例子 var x = 1; function test(){ var x = 0; alert( alert(x); } tes ...

  4. boost库之 shared_ptr学习笔记

  5. 【转】程序员应该了解的——除了coding我们还有很多事要做

    from : http://www.cnblogs.com/lingyun1120/archive/2011/10/09/2203306.html try { if (you.believe(it) ...

  6. vim编辑器安装命令使用命令和设置的使用总结

    vim编辑器的安装 vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率.本文讲解主要是在Cento ...

  7. 接口测试基础——第2篇smtplib发送带附件的邮件

    我先给大家补充一个用QQ发送纯文本电子邮件的代码,用QQ的朋友可以参考一下: # coding=utf-8 import smtplib from email.mime.text import MIM ...

  8. Jam的计数法

    Jam的计数法 题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数 ...

  9. webpack新版本4.12应用九(配置文件之使用不同语言进行配置)

    使用不同语言进行配置(configuration languages) 查看原文|编辑此页 webpack 接受以多种编程和数据语言编写的配置文件.支持的文件扩展名列表,可以在 node-interp ...

  10. 学习动态性能表(4)--v$sqltext&v$sqlarea

    学习动态性能表 第四篇-(1)-V$SQLTEXT  2007.5.29 本视图包括Shared pool中SQL语句的完整文本,一条SQL语句可能分成多个块被保存于多个记录内. 注:V$SQLARE ...