• [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

  • 相关阅读:
    Java File类应用:递归遍历文件夹和递归删除文件
    综合应用题:多线程复制文件(知识点:多线程、随机读写流)
    Java IO流之随机读写流RandomAccessFile
    Java之枚举----小试牛刀练习
    Java之枚举
    PHP笔试题及答案
    静态方法何时使用
    你怎么理解并使用静态方法和实例化方法的?
    99%的人理解错 HTTP 中 GET 与 POST 的区别
    描述一下大流量高并发量网站的解决方案
  • 原文地址:https://www.cnblogs.com/qqhfeng/p/4769524.html
Copyright © 2020-2023  润新知