[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
[C#] 等待启动的进程执行完毕的更多相关文章
- Java多线程--让主线程等待所有子线程执行完毕
数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis() ...
- java主线程等待所有子线程执行完毕在执行(常见面试题)
java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个 ...
- netframework中等待多个子线程执行完毕并计算执行时间
本文主要描述在.netframework中(实验环境.netframework版本为4.6.1)提供两种方式等待多个子线程执行完毕. ManualResetEvent 在多线程中,将ManualRes ...
- c#等待所有子线程执行完毕方法
当我们在使用线程中,你会发现主线结束后子线程的结果才显示出来.现在我要等待所以子线程结束,然后在显示结果,怎么做呢? 方法如下: 1.使用 ManualResetEvent,代码如下: using ...
- C# 本进程执行完毕后再执行下一线程
最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待. 代码: using System; using Sys ...
- Java主线程等待所有子线程执行完毕再执行解决办法(转)
方法一: Thread.join()方法,亲测可行,thread.join()方法 Vector<Thread> ts = new Vector<Thread>(); for ...
- python 启动新进程执行脚本
import subprocess p_restart=subprocess.Popen(['/bin/sh','/etc/init.d/xxx_service','reboot'])
- CountDownLatch用法---等待多个线程执行完才执行
CountDownLatch用法---等待多个线程执行完才执行 CountDownLatch用法---等待多个线程执行完才执行 CountDownLatch用法---等待多个线程执行完才执行 Coun ...
- C#winform调用外部程序,等待外部程序执行完毕才执行下面代码
1.简单调用外部程序文件(exe文件,批处理等),只需下面一行代码即可 System.Diagnostics.Process.Start(“应用程序文件全路径”); 2.如果要等待调用外部程序执行完毕 ...
随机推荐
- Qt事件系统基本概念
(转自:http://www.cnblogs.com/andy1987/p/3322059.html) 1. QT事件系统 Qt应用程序的消息处理是基于事件驱动的,程序的每个动作都是由某个事件所触发的 ...
- 大马猴队-Alpha阶段项目复审
队名 优点 缺点 名次 菜鸡互坑队 经典游戏,情怀加分. 刷新的苹果会在蛇身上出现 14 菜鸡互啄 利用python语言实现git版本管理,典型用户清晰. 没有很好地分析用户痛点,没有测试计划 4 ...
- 剑指offer--24.树的子结构
时间限制:1秒 空间限制:32768K 热度指数:407165 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) class Solution ...
- Siemens
Sr.EE-Complete the electronics and mechanical designs from design concepts to mass production for RU ...
- 10.排序数组中和为给定值的两个数字[Find2NumbersWithGivenSum]
[题目] 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1 ...
- SQL面试题-行列互换-if、【case when】
http://www.cda.cn/view/21469.html tb_lemon_grade中,表中字段id,student_name,course,score分别表示成绩id,学生姓名,课程名称 ...
- 【操作系统】总结五(I/O管理)
输入输出管理本章主要内容: I/O管理概述(I/O控制方式.I/O软件层次结构)和I/O核心子系统(I/O调度概念.局速缓存与缓冲区.设备分配与回收.假脱机技术(SPOOLing)). 5.1 I/O ...
- SQLite3的运用
1.导入库文件:libsqlite3. 2..m文件的代码: // // ViewController.m // SQLite3的运用 // // Created by PengYunjing on ...
- 转载 eclipse中的include设置
备注:在10.1版的niosii使用的eclipse中设置的方法是右键->properties->c/c++general->path and symbols->include ...
- innerHTML和innerText怎么区分
示例代码:<div id="test"> <span style="color:red">test1</span> test ...