如何在C# 中查找或结束程序域中的主、子进程

作者:一只独行的猿 时间:2023-06-14 20:00:41 

有时候,我们的程序需要启动一些子进程,如嵌入的图形程序。

当启动一个进程后,获得这个进程信息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;

来源:https://www.cnblogs.com/pilgrim/p/10831151.html

标签:c#,程序域,进程
0
投稿

猜你喜欢

  • java 较大数据量取差集,list.removeAll性能优化详解

    2022-11-06 16:52:15
  • maven的pom文件与打包详解

    2023-12-24 00:23:51
  • java中main函数你知道多少

    2023-05-26 12:32:15
  • Opencv EigenFace人脸识别算法详解

    2023-07-21 19:30:17
  • 改进c# 代码的五个技巧(二)

    2023-01-09 08:57:56
  • IDEA:Git stash 暂存分支修改的实现代码

    2023-11-29 09:16:35
  • JAVA简单工厂模式(从现实生活角度理解代码原理)

    2021-10-29 12:39:32
  • spring boot下 500 404 错误页面处理的方法

    2021-09-03 07:12:36
  • 详解Spring Cloud中Hystrix的请求合并

    2022-07-06 14:53:06
  • Android Dialog对话框用法实例详解

    2022-11-04 02:38:47
  • C#中Json的简单处理方法

    2022-05-19 05:25:14
  • 利用Spring boot+LogBack+MDC实现链路追踪

    2023-10-03 16:02:53
  • android studio使用SQLiteOpenHelper()建立数据库的方法

    2023-10-28 12:50:35
  • VS2019配置opencv详细图文教程和测试代码的实现

    2023-07-17 13:49:31
  • WebSocket实现Web聊天室功能

    2023-11-27 06:10:52
  • Java实现平滑加权轮询算法之降权和提权详解

    2022-10-02 20:51:22
  • C# Invoke,begininvoke的用法详解

    2023-07-21 01:55:55
  • Java synchronized轻量级锁实现过程浅析

    2022-05-08 07:28:55
  • C#仿QQ聊天窗口

    2022-09-30 09:12:39
  • 详解Spring循环依赖的解决方案

    2022-05-29 13:14:57
  • asp之家 软件编程 m.aspxhome.com