如何在WXP(和更新的MSWindows)上使用C#终止所有[grand]子进程

问题:如何确定子进程树中的所有进程以杀死它们?我有一个用C#编写的应用程序,它将:从服务器获取一组数据,然后,生成第三方实用程序来处理数据将结果返回给服务器.这工作正常.但是由于运行会占用大量CPU并且可...

问题:如何确定子进程树中的所有进程以杀死它们?

我有一个用C#编写的应用程序,它将:

>从服务器获取一组数据,
>然后,生成第三方实用程序来处理数据
>将结果返回给服务器.

这工作正常.但是由于运行会占用大量CPU并且可能需要长达一个小时,因此我想添加让我的应用终止其子进程的能力.

我在其他地方找到的简单解决方案的一些问题是:

>我的应用程序的子进程“A”(我认为是InstallAnywhere EXE)产生真正的处理应用程序“B”(一个java.exe),它反过来产生更多的孩子“C1”……“Cn”(其中大部分都是写的)在Java).
>我的应用程序可能有多个副本(因此,它的多个子集)在同一台机器上运行.
>子进程不在我的控制范围内,因此将来可能会有一些“D”进程.
>我的应用程序必须在32位和64位版本的MSWindows上运行.

从好的方面来说,没有数据丢失的问题,只要流程以相当快的速度结束,“干净”关闭就无关紧要了.

解决方法:

我想你可以用the MSDN forums的代码杀死你的孙子孙女.

public bool killProcess(int pid)
 {
  bool didIkillAnybody = false;
  try
  {
   Process[] procs = Process.GetProcesses();
   for (int i = 0; i < procs.Length; i++)
   {
    didIkillAnybody = GetParentProcess(procsIdea.Id) == pid) &&
                                   killProcess(procsIdea.Id);
   }
   try
   {
    Process myProc = Process.GetProcessById(pid);
    myProc.Kill();
    return true;
   }
   catch { }
  }
  catch (Exception ex)
  {
   try
   {
    new Logger().Write("Exception caught at JobExecution.killProcess()", ex.Message, System.Diagnostics.EventLogEntryType.Warning, false);
   }
   catch { }
  }
  return didIkillAnybody;
 }

 private int GetParentProcess(int Id)
 {
  int parentPid = 0;
  using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString() + "'"))
  {
   mo.Get();
   parentPid = Convert.ToInt32(mo["ParentProcessId"]);
  }
  return parentPid;
 }

本文标题为:如何在WXP(和更新的MSWindows)上使用C#终止所有[grand]子进程

基础教程推荐