【发布时间】:2012-02-12 06:44:00
【问题描述】:
此代码在大量机器上按预期运行。然而在一台特定的机器上,对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 尚未在此计算机上激活。
- 按照 cmets 中的建议,我尝试使用
GetProcessesByName获取“现有”进程 ID,但这只会在问题机器上返回一个空数组。因此,很难说问题出在WaitForExit上,因为即使在调用WaitForExit之前,调用GetProcessesByName也不会返回进程。 - 在问题机器上,生成的记事本进程的 ParentID 是代码手动启动的记事本进程的 ID,或者换句话说,记事本正在生成一个子进程并自行终止。
【问题讨论】:
-
有没有可能之前打开过另一个记事本?所以你创建一个,杀死一个,但仍然看到旧的记事本?
proc.WaitForExit()可能会立即返回,如果由于某些原因无法创建进程或直接终止进程,例如缺少原始代码创建新进程的权限。 -
@oleskii,不,我已经确定了这一点。记事本在这里只是作为“大家都知道”的进程使用,不管进程使用哪个文件都会出现这个问题。
-
我不知道
WaitForExit()的不同行为。您确定您启动的进程与您在 taskmgr 中打开的进程相同吗?您能否检查您打开的 Notepad.exe 实例的 PID(进程 ID)是否与您的proc实例的 PID 相同? -
将机器拖到4楼,打开窗户让它滑倒。这不值得你花时间。
-
你试过用
Process.StartInfo.UseShellExecute = false运行它吗?