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

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

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. elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样

    elasticSearch的配置文件中有2个参数:node.master和node.data.这两个参 数搭配使用时,能够帮助提供服务器性能. 数据节点node.master: false node. ...

  2. 【dlbook】深度网络

    前向网络:无反馈 feedback 连接 [输出单元] 线性 -- 高斯分布 . sigmoid单元 -- bernoulli输出. softmax单元 -- multinoulli [隐藏单元] 整 ...

  3. NGUI 学习使用

    http://www.tasharen.com/forum/index.php?board=12.0

  4. [QT][待解决问题]对话框ui载入卡顿问题

    电脑运行环境:win7 + qt-opensource-windows-x86-mingw530-5.8.0源码是 < Qt快速入门系列教程目录 > 第3篇 Qt5基础(三)Qt登录对话框 ...

  5. NOIP模拟题 膜法

    题目大意 给定若干组询问求$\sum\limits_{i=l}^r \dbinom{i}{k}$. 最终输出每组询问答案的乘积. 题解 首先把$l,r$分开处理相减,只需要求$\sum\limits_ ...

  6. hibernate 多对多(many-to-many)

    多对多(many-to-many):在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型:hibernate会为我们创建中间关联表,转换成两个一对多. 1. E- ...

  7. LOJ10042 收集雪花

    题意 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望有重 ...

  8. vuecli3修改项目启动端口

    工作中可能存在启动多个项目的时候,默认端口号会被占,导致启动错误,这种情况下只要把要启动的项目的端口号换掉启动未用的端口就可以了,具体实现如下: vuecli3中的端口文件存放目录为:node_mod ...

  9. Python脚本MAC上双击执行,如何设置?

    1.在文件首行添加如下代码: 如果你想使用默认python版本执行当前的脚本,即python2,则需要添加 #!/usr/bin/env python # -*- coding: utf-8 -*- ...

  10. 为什么 I2C(IIC)需要上拉电阻

    源鑫问: I2C时钟线和数据线为什么要接上拉电阻? 因为 I2C 的 IO 是开漏的,所以需要上拉电阻. 延伸: 之前 hippo曾经说过有人将 IO 设置为 PP,可能会烧 IO. 之前以为 I2C ...