System.Diaganostics.Process.Id与任务管理器中显示的进程ID不同。为什么?我正在使用C#的System.Diagnostic.Process对象。它的属性之一是Id。此生成的Id与Windows任务管理器显示的PID相同。为什么会这样?一旦该过程开始,您就会看到。它启动了另外两个非托管进程,我无法通过对象属性引用显式获取ID。我必须搜索所有进程,通过System.Diagnostics.Process.GetProcesses()按进程名称找到它们。我试图找到一种可靠的方法来通过PID终止此进程和所有相关进程,这就是任务管理器中显示的内容。有没有更好的办法?我无法终止具有关联进程名称的所有进程,因为这可能会终止那些与我的程序无关的进程的其他实例。关键是你不想通过Id杀死你的进程。事实上,这是一个竞争条件:您产生的进程可能会死亡,而另一个进程可能会使用相同的Id创建。然后,当你去杀死它时,你最终会杀死新进程而不是死掉的旧进程。杀死派生进程的最可靠方法是将它们放入Job对象中,并在任务完成后终止Job。这是一些现实作业类的简单代码:[DllImport("kernel32.dll")]publicstaticexternboolAssignProcessToJobObject(IntPtrhJob,IntPtrhProcess);[DllImport("kernel32.dll")]publicstaticexternboolTerminateJobObject(IntPtrhJob,uintuExitCode);IntPtr工作;publicProcessStartProc(stringcommandLine){if(job==IntPtr.Zero)job=CreateJobObject(IntPtr.Zero,null);ProcessStartInfosi=newProcessStartInfo(@"c:windowssystem32cmd.exe");si.Arguments="/c"+commandLine;si.CreateNoWindow=false;si.UseShellExecute=false;Processproc=Process.Start(si);AssignProcessToJobObject(作业,proc.Handle);返回过程;}publicvoidTerminateProc(){//终止Job对象,它会杀死其中的所有进程if(job!=null)TerminateJobObject(job,0);job=IntPtr.Zero;}}我无法重新发现这一点。我刚刚运行了以下代码:foreach(varprocinProcess.GetProcesses().OrderBy(proc=>proc.Id)){Console.WriteLine("{0}:{1}",p.Id,p.ProcessName);}列出的所有进程都与任务管理器中的PID匹配。这是使用Windows7-您使用的是什么操作系统?如果您查看其他进程,它们是否与任务管理器中显示的PID匹配?以上是C#学习教程:System.Diaganostics.Process.Id与任务管理器中显示的进程ID不一样。为什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
