关键是您不想通过 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;
}
}