我写的应用程序的启动和监测等应用。我使用的系统。诊断。处理类开始应用程序,然后监测应用的使用过程。应对财产调查国家的应用程序,每100milisecs.我使用过程。CloseMainWindow停止应用程序或过程。杀死杀了,如果它不响应。

我注意到一个奇怪的行为在那里有时过程的目的进入一个国家在作出答复的属性始终返回即使当潜在的进程挂在一个循环和其它不响应CloseMainWindow.

一个方法重现,这是对调查作出答复的财产的权利之后开始的过程中的实例。因此,例如

_process.Start();
bool responding = _process.Responding;

将重现的错误态的话

_process.Start();
Thread.Sleep(1000);
bool responding = _process.Responding;

将工作。减少睡眠周期有500将介绍的误差的状态。

东西在叫_process.回答太快启动后似乎可以防止的对象,从得到正确的窗户队列消息的处理程序。我猜我需要等待_process.开始到结束,这样做它是异步的工作。是否有更好的办法等待这一比打电话线。睡了吗?我不太相信,1000ms将永远是不够的。

有帮助吗?

解决方案

现在,我需要检查了后来,但我肯定有一个方法,告诉线等待,直到它已准备好为的输入。你是监测GUI进程。

是不是 过程。WaitForInputIdle 任何帮助你?还是我的缺点?:)

更新

下一个聊天上Twitter(或鸣叫-鸣叫?) 与Mendelt我想我应该更新我的答案,所以将社会完全了解..

  • WaitForInputIdle 只会的工作应该有一个图形用户界面。
  • 你指定要等待的时间,并且该方法返回bool如果进程到达空闲状态在这一时间框架,可以明显地使用这一循环,如果需要,或处理,因为适当。

希望有助于:)

其他提示

我认为增强对_process.Responding的检查可能会更好,这样如果Responding属性返回false超过5秒(例如),你只会尝试停止/终止进程。

我认为您可能会发现,应用程序可能会“无法响应”。他们正在进行更密集的处理,一瞬间。

我认为一种更宽松的方法会更好地工作,允许一个过程“不响应”。在短时间内,只有在反复“无响应”的情况下才采取行动。几秒钟(或者你想要多长时间)。

进一步说明:Microsoft文档表明Responding属性与用户界面特别相关,这就是新启动的进程可能没有立即响应UI的原因。

感谢您的回答。此

_process.Start();
_process.WaitForInputIdle();
似乎解决了这个问题。它仍然很奇怪,因为Responding和WaitForInputIdle都应该使用相同的win32 api调用。

更多背景信息
GUI应用程序有一个带有消息队列的主窗口。 Responding和WaitForInputIdle通过检查进程是否仍处理来自此消息队列的消息来工作。这就是他们只使用GUI应用程序的原因。不知怎的,似乎调用Responding太快会干扰让Process获取该消息队列的句柄。调用WaitForInputIdle似乎可以解决这个问题。

我将不得不潜入反射器,看看我是否能理解这一点。

更新结果 似乎在启动后检索与进程关联的窗口句柄足以触发奇怪的行为。像这样:

_process.Start();
IntPtr mainWindow = _process.MainWindowHandle;

我使用Reflector进行了检查,这就是Responding在幕后所做的事情。似乎如果你太快得到MainWindowHandle,你会得到错误的一个,它会在进程的剩余生命周期中使用这个错误的句柄,或直到你调用Refresh();

更新结果 调用WaitForInputIdle()只能在某些时候解决问题。每次阅读Responding属性时调用Refresh()似乎都会更好。

我在大约两年前的一个项目中也注意到了这一点。在请求某些道具值之前,我调用了.Refresh()。当我需要调用.Refresh()时,这是一种试错法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top