有時候,咱們的程序須要啓動一些子進程,如嵌入的圖形程序。數組
當啓動一個進程後,得到這個進程信息Process,而後其內部在某個時刻啓動了一個子進程,這個時候就涉及程序域和進程樹的概念。當咱們經過非正常操做的方式結束前面得到的進程信息Process時(如Kill掉),可能並無實際結束子進程。由於當有主進程啓動了子進程後,全部的進程其實是被放在程序域中運行的(winform的Program文件中的Application域中),而結束的僅僅是域中的某個進程。固然,若是咱們正常推出主進程,實際上Application在推出時,作了不少操做,以結束整個域中的信息;若是採用捕捉的Process結束,Application並無徹底執行退出(使用Application的Exit事件,能夠檢驗)。spa
若是要徹底退出相關進程,就須要查找主進程下的全部子進程,並結束全部進程:code
/// <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的方法:orm
//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;blog