如何在C# 中查詢或結束程式域中的主、子程序
阿新 • • 發佈:2020-11-09
有時候,我們的程式需要啟動一些子程序,如嵌入的圖形程式。
當啟動一個程序後,獲得這個程序資訊Process,然後其內部在某個時刻啟動了一個子程序,這個時候就涉及程式域和程序樹的概念。當我們通過非正常操作的方式結束前面獲得的程序資訊Process時(如Kill掉),可能並沒有實際結束子程序。因為當有主程序啟動了子程序後,所有的程序實際上是被放在程式域中執行的(winform的Program檔案中的Application域中),而結束的僅僅是域中的某個程序。當然,如果我們正常推出主程序,實際上Application在推出時,做了很多操作,以結束整個域中的資訊;如果採用捕捉的Process結束,Application並沒有完全執行退出(使用Application的Exit事件,可以檢驗)。
如果要完全退出相關程序,就需要查詢主程序下的所有子程序,並結束所有程序:
/// <summary> /// 結束程序和相關的子程序 /// </summary> /// <param name="pid">需要結束的程序ID</param> public static void KillProcessAndChildren(int pid) { ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid); ManagementObjectCollection moc = searcher.Get(); foreach (ManagementObject mo in moc) { KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"])); } try { Process proc = Process.GetProcessById(pid); Console.WriteLine(pid); proc.Kill(); } catch (ArgumentException) { /* process already exited */ } }
查詢程序ID的方法:
//1.根據程序id,獲得程序 Process p = Process.GetProcessById(100); //2.獲取當前程序 Process p = Process.GetCurrentProcess(); //3.根據程序名字獲取程序,返回的結果是一個數組 Process p = (Process.GetProcessesByName("DriverEasy"))[0];
其中,以上程式碼需要先引入System.Management.dll(在Framework中找到相關引用);再引入命令空間:System.Management;
以上就是如何在C# 中查詢或結束程式域中的主、子程序的詳細內容,更多關於c# 程式域的資料請關注我們其它相關文章!