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;}}