时间:2021-05-19
有时候,我们的程序需要启动一些子进程,如嵌入的图形程序。
当启动一个进程后,获得这个进程信息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) { } }查找进程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# 程序域的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#启动进程的几种常用方法。分享给大家供大家参考。具体如下:1.启动子进程,不等待子进程结束privatevoidsimpleRun_Click(
1如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在C#中访问J
问:1.如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在C#中
一、托管代码/非托管代码C#代码通过C#编译器编译成程序集,程序集由微软中间语言组成,CLR会为程序集开辟一个应用程序域,程序集就是运行在这个应用程序域里面的,
本文实例讲述了C#中父窗口和子窗口之间控件互操作的方法。分享给大家供大家参考。具体分析如下:很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子