如何在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é)束程序域中的主、子進程的詳細(xì)內(nèi)容,更多關(guān)于c# 程序域的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#中使用jieba.NET、WordCloudSharp制作詞云圖的步驟
之前一篇文章介紹的是使用Python的jieba、wordcloud的庫生成詞云圖,本文則介紹在C#中如何使用jieba.NET、WordCloudSharp庫生成詞云圖,感興趣的朋友一起看看吧2021-07-07c#實現(xiàn)幾種數(shù)據(jù)庫的大數(shù)據(jù)批量插入
這篇文章主要介紹了c#實現(xiàn)幾種數(shù)據(jù)庫的大數(shù)據(jù)批量插入,主要包括SqlServer、Oracle、SQLite和MySQL,有興趣的可以了解一下。2017-01-01Visual Stodio2022中沒有mysql.dll的解決辦法
這篇文章介紹了Visual Stodio2022中沒有mysql.dll的解決辦法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12