[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

转载于:https://www.cnblogs.com/qqhfeng/p/4769524.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值