我正在使用 C#System.Diagnostic.Process
object.
它的属性之一是Id
.
The Id
这产生的与PID
,如图所示Windows Task Manager
.
为什么是这样?
你看,一旦这个过程开始。
它启动了另外两个非托管进程,我无法通过对象属性引用显式获取它们的 ID。
我必须搜索所有进程才能通过进程名称找到它们System.Diagnostics.Process.GetProcesses()
.
我正在尝试找到一种可靠的方法来终止此进程以及所有关联的进程PID
,显示在Task Manager
.
有没有更好的办法?
我不能直接杀死具有关联进程名称的所有进程,因为这可能会杀死与我的程序无关的进程的其他实例。
关键是你不想通过 Id 杀死你的进程。事实上,这是一个竞争条件:您生成的进程可能会终止,并且可能会使用相同的 ID 创建另一个进程。然后,当你去杀死它时,你最终会杀死新进程,而不是已经死掉的旧进程。
终止生成的进程的最可靠方法是将它们放入 Job 对象中,并在任务完成后终止 Job。
下面是一些实现 Job 类的简单代码:
class Job
{
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr CreateJobObject(IntPtr lpJobAttributes, string lpName);
[DllImport("kernel32.dll")]
public static extern bool AssignProcessToJobObject(IntPtr hJob, IntPtr hProcess);
[DllImport("kernel32.dll")]
public static extern bool TerminateJobObject(IntPtr hJob, uint uExitCode);
IntPtr job;
public Process StartProc(string commandLine)
{
if (job == IntPtr.Zero)
job = CreateJobObject(IntPtr.Zero, null);
ProcessStartInfo si = new ProcessStartInfo(@"c:\windows\system32\cmd.exe");
si.Arguments = "/c " + commandLine;
si.CreateNoWindow = false;
si.UseShellExecute = false;
Process proc = Process.Start(si);
AssignProcessToJobObject(job, proc.Handle);
return proc;
}
public void TerminateProc()
{
// terminate the Job object, which kills all processes within it
if (job != null)
TerminateJobObject(job, 0);
job = IntPtr.Zero;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)