摘要:[C#] 等待啟動的處理序執行完畢
Introduction
有能有時候我們啟動了一個處理序,必須等到此處理序執行完畢,或是,一段時間,
關閉處理序後再繼續往下走。
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;
            }
        }     原始程式碼
三小俠 小弟獻醜,歡迎指教