[C#] 等待启动的进程执行完毕_c#等待执行完成-CSDN博客

from: https://www.cnblogs.com/qqhfeng/p/4769524.html

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

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

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();//执行的进程必须有UI,如果没有UI,则忽略这个
        //设定要等待相关的进程结束的时间,并且阻止目前的线程执行,直到等候时间耗尽或者进程已经结束为止。 
        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;
        }
    }

原网址: 访问
创建于: 2024-06-20 11:51:40
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论