此代码按预期在大量机器上运行。然而,在一台特定的机器上,对WaitForExit()
的呼叫似乎被忽略,事实上标志着该过程已退出。Process.WaitForExit在不同机器上不一致
static void Main(string[] args)
{
Process proc = Process.Start("notepad.exe");
Console.WriteLine(proc.HasExited); //Always False
proc.WaitForExit(); //Blocks on all but one machines
Console.WriteLine(proc.HasExited); //**See comment below
Console.ReadLine();
}
注意,不像SO一similar question,该过程被称为是notepad.exe
(用于测试的原因),所以这是不可能的症结在于它 - 即它不产卵第二子过程和关闭。即便如此,这也无法解释为什么它可以在所有其他机器上运行。
在有问题的机器上,即使记事本仍在屏幕上和任务管理器中清楚地打开,第二次调用Console.WriteLine(proc.HasExited))
返回true
。
机器运行Windows 7和.NET 4.0。
我的问题是;该特定机器上的哪些条件可能导致这种情况?我应该检查什么?
编辑 - 事情到目前为止/更新/可能相关的信息,我已经试过:
- 重新安装.NET。
- 关闭我在任务管理器中不知道的任何进程。
- Windows尚未在此机器上激活。
- 按照意见中的建议,我尝试使用
GetProcessesByName
获得'现有'进程标识,但是这只是在问题机器上返回空数组。因此,很难说问题与WaitForExit
一样,因为在调用WaitForExit
之前,不会通过调用GetProcessesByName
来返回该过程。 - 在问题机,将得到的记事本过程的PARENTID是记事本过程的ID代码手动启动,或换句话说,记事本是产卵子进程和终止本身。
是否有可能之前打开过另一个记事本?所以你创建一个,杀死一个,但仍然看到旧的记事本? 'proc.WaitForExit()'可能会立即返回,如果进程无法创建或由于某些原因被直接终止,例如缺少创建新进程的原始代码的特权。 – oleksii 2012-01-17 13:05:48
@oleskii,不,我已经确定了这一点。记事本仅作为一个“大家都知道”的过程在此处使用,无论该过程使用哪个文件,都会发生此问题。 – Rotem 2012-01-17 13:07:03
@oleskii“proc.WaitForExit()可能会立即返回,如果进程无法创建或由于某些原因被直接终止” - 在这种情况下,进程是否也会被终止? – Rotem 2012-01-17 13:10:14