从Process.Start返回不同的引用

时间:2011-05-31 08:15:18

标签: c# .net-4.0 process reference taskmanager

ProcessStartInfo psi = new ProcessStartInfo(BatchFile)

Process p = Process.Start(psi)

为什么p.ID与WindowsTaskManager中可见的进程ID不同

BatchFile是具有适当参数的外部程序的路径)

3 个答案:

答案 0 :(得分:2)

我假设BatchFile是某种cmd或bat文件,它逐个运行其他进程 因此,在Windows任务管理器中,您实际上会看到由批处理文件运行的那些进程的ID。

实施例

如果我这样做

 var p = Process.Start("notepad.exe");

p.Id将与任务管理器中的PID匹配。

但是,如果我这样做:

 var p = Process.Start("test.cmd"); // test.cmd has notepad.exe call inside

p.Id将与任务管理器中显示的PID不同。

答案 1 :(得分:2)

我认为这是因为p.ID是运行批处理文件的进程的id,而不是通过批处理文件启动的进程的id。

您可以使用correct overload

直接通过Process.Start启动可执行文件

答案 2 :(得分:1)

进程ID仅在进程处于活动状态时才有意义。要检查的第一件事是.HasExited - 如果是这样, 忽略 进程ID;它已经没有任何意义了。

即使您仍然可以在屏幕上看到,有很多方法可以启动某些内容并且没有任何进程

  • 如果是一个产生并退出的脚本/ bat / cmd(请记住:您正在观看脚本,而不是“某事”)
  • 如果exe在内部执行一些内部的巫术 - 例如,大多数办公应用程序和Internet Explorer都这样做;如果有现有流程,它会将args转发到流程进行处理,并立即退出