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

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

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

    题解: 二分图判断 建立原图的补图 判断是否是二分图 代码: #include<cstdio> #include<cmath> #include<cstring> ...

  2. ZOJ 3211 Dream City(线性DP)

    Dream City Time Limit: 1 Second      Memory Limit: 32768 KB JAVAMAN is visiting Dream City and he se ...

  3. Java8_02_lambda表达式

    一.前言 这一节我们来了解下lambda表达式,主要关注以下几点: 行为参数化 匿名类 Lambda 表达式 方法 引用 二.行为参数化 1.概念 行为参数化(behavior parameteriz ...

  4. 基于Python实现的四则运算生成程序

    Github项目地址:传送门 小组成员:黄晓彬(代码实现) 黄钰城(代码审查) 需求: 1. 使用 -n 参数控制生成题目的个数. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的 ...

  5. 阿里maven镜像服务器配置

    把下面的配置复制到 .m2/settings.xml配置文件中. <?xml version="1.0" encoding="UTF-8"?> &l ...

  6. Windows 使用技巧

    怎样添加“发送到”的快捷方式,cmd里面shell:sendto打开文件夹,把快捷方式放进去就可以了. vs中c#快速实现接口所有函数快捷键: 鼠标放在实现的接口上面+shift+alt+F10.

  7. 2 秒杀系统模拟基础实现,使用Redis实现

    这一篇,我们来使用redis进行数据存储. 新建一个redis的service实现类 package com.tianyalei.service; import com.tianyalei.model ...

  8. Windows Phone 8 Programming Considerations

    OpenGL ES 2.0 Support Marmalade supports the Open GL ES 2.0 Graphics API on Windows Phone 8 using a ...

  9. Python解析excel文件并存入sqlite数据库

    最近由于工作上的需求 需要使用Python解析excel文件并存入sqlite 就此做个总结 功能:1.数据库设计 建立数据库2.Python解析excel文件3.Python读取文件名并解析4.将解 ...

  10. 压缩感知Compressive sensing(一)

    compressive sensing(CS) 又称 compressived sensing ,compressived sample,大意是在采集信号的时候(模拟到数字),同时完成对信号压缩之意. ...