1. 程式人生 > 程式設計 >如何在C# 中查詢或結束程式域中的主、子程序

如何在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;

以上就是如何在C# 中查詢或結束程式域中的主、子程序的詳細內容,更多關於c# 程式域的資料請關注我們其它相關文章!