问题:如何确定子进程树中的所有进程以杀死它们?我有一个用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]子进程
- Unity Shader实现模糊效果 2023-04-27
- 如何使用C# 捕获进程输出 2023-03-10
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- c# 模拟线性回归的示例 2023-03-14
- user32.dll 函数说明小结 2022-12-26
- .NET CORE DI 依赖注入 2023-09-27
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- Oracle中for循环的使用方法 2023-07-04
- Unity3D实现渐变颜色效果 2023-01-16