有能有时候我们启动了一个进程,必须等到此进程执行完毕,或是,一段时间,
关闭进程后再继续往下走。
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