C#中查找或結束程序域中的主、子進程


有時候,我們的程序需要啟動一些子進程,如嵌入的圖形程序。

當啟動一個進程后,獲得這個進程信息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;

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM