2016-04-14 103 views
1

我有一些像这样的代码:WaitForExit不会超时正确的,只是挂

process.CloseMainWindow(); 
if (!process.WaitForExit(5000)) { process.Kill(); } 

的想法是优雅地让进程退出,但如果需要超过5秒,我认为它需要杀害。

这似乎在大多数情况下工作,但如果该进程已抛出一个Windows错误消息,它只是挂起。我以前只有“process.Kill()”,并且工作,所以我不得不假定它实际上停留在WaitForExit(5000)调用上,即使我给它一个超时值。

这会发生什么原因?

编辑:我想知道如果可能它是CloseMainWindow()实际挂,因为该错误消息。在这种情况下,在尝试CloseMainWindow()方法之前检查进程的“响应”属性实际返回“false”?如果是这样,我可以检查,然后使用杀死,如果是这样的话。

+0

Windows正在终止进程,因此不会出现退出。 – jdweng

+0

不,过程仍在运行,我可以看到错误框后面的窗口。 –

+0

如果您遇到Marshal.GetLastWin32Error的窗口错误,那么测试如何?如果进程正在运行,只杀死进程。在杀死之前测试过程是否仍然存在。 – jdweng

回答

0

首先,我要感谢Marc为了解决这个问题,我从来没有想到我会以这种方式重现错误。

在任何情况下,阅读CloseMainWindow帮助文件()后更仔细,我看到了这一点:

Return Value 
Type: System.Boolean 
true if the close message was successfully sent; false if the associated 
process does not have a main window or if the main window is disabled (for 
example if a modal dialog is being shown). 

所以,正确的有它说,一个模式对话框(如错误我所看到的),会导致这个问题。现在我不确定它为什么不会在超时后死亡,但我认为我可以使用这个返回值来杀死这个场景中的进程。

+0

您也可以检查[HasExited property](https://msdn.microsoft.com/en-us /library/system.diagnostics.process.hasexited(v=vs.110).aspx),在while循环中检查之前执行'process.Refresh()'。 – Quantic