如何在C# 中查找或結(jié)束程序域中的主、子進程
有時候,我們的程序需要啟動一些子進程,如嵌入的圖形程序。
當(dāng)啟動一個進程后,獲得這個進程信息Process,然后其內(nèi)部在某個時刻啟動了一個子進程,這個時候就涉及程序域和進程樹的概念。當(dāng)我們通過非正常操作的方式結(jié)束前面獲得的進程信息Process時(如Kill掉),可能并沒有實際結(jié)束子進程。因為當(dāng)有主進程啟動了子進程后,所有的進程實際上是被放在程序域中運行的(winform的Program文件中的Application域中),而結(jié)束的僅僅是域中的某個進程。當(dāng)然,如果我們正常推出主進程,實際上Application在推出時,做了很多操作,以結(jié)束整個域中的信息;如果采用捕捉的Process結(jié)束,Application并沒有完全執(zhí)行退出(使用Application的Exit事件,可以檢驗)。
如果要完全退出相關(guān)進程,就需要查找主進程下的所有子進程,并結(jié)束所有進程:
/// <summary>
/// 結(jié)束進程和相關(guān)的子進程
/// </summary>
/// <param name="pid">需要結(jié)束的進程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.根據(jù)進程id,獲得進程
Process p = Process.GetProcessById(100);
//2.獲取當(dāng)前進程
Process p = Process.GetCurrentProcess();
//3.根據(jù)進程名字獲取進程,返回的結(jié)果是一個數(shù)組
Process p = (Process.GetProcessesByName("DriverEasy"))[0];
其中,以上代碼需要先引入System.Management.dll(在Framework中找到相關(guān)引用);再引入命令空間:System.Management;
以上就是如何在C# 中查找或結(jié)束程序域中的主、子進程的詳細內(nèi)容,更多關(guān)于c# 程序域的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#發(fā)送HttpPost請求來調(diào)用WebService的方法
在C#中發(fā)送HttpPost請求來調(diào)用WebService中的MyAction方法,代碼如下:需要的朋友可以參考一下2013-03-03
C#使用log4net結(jié)合sqlite數(shù)據(jù)庫實現(xiàn)記錄日志
因為結(jié)構(gòu)化的數(shù)據(jù)庫存儲的日志信息,可以寫專門的軟件讀取歷史日志信息,通過各種條件篩選,可操作性極大增強,有這方面需求的開發(fā)人員可以考慮,本文給大家介紹了C#使用log4net結(jié)合sqlite數(shù)據(jù)庫記錄日志,需要的朋友可以參考下2024-10-10

