我正在用 C# 编写一个应用程序来启动和监视其他应用程序。我使用 System.Diagnostics.Process 类启动应用程序,然后使用 Process.Responding 属性每 100 毫秒轮询一次应用程序的状态来监视应用程序。我使用 Process.CloseMainWindow 来停止应用程序,或者在应用程序没有响应时使用 Process.Kill 来终止它。
我注意到一种奇怪的行为,有时进程对象会进入一种状态,即使底层进程挂起在循环中并且不响应 CloseMainWindow,响应属性也始终返回 true。
重现它的一种方法是在启动流程实例后立即轮询 Responding 属性。例如
_process.Start();
bool responding = _process.Responding;
将重现错误状态
_process.Start();
Thread.Sleep(1000);
bool responding = _process.Responding;
将工作。
将睡眠周期减少到 500 将再次引入错误状态。
启动后调用 _process.Responding 太快似乎会阻止对象获取正确的 Windows 消息队列处理程序。我想我需要等待 _process.Start 完成它的异步工作。有没有比调用 Thread.Sleep 更好的等待方法?我不太相信 1000 毫秒就足够了。
现在,我需要稍后检查一下,但我确信有一种方法可以告诉线程等待,直到准备好输入。您只监控 GUI 进程吗?
Isn't Process.WaitForInputIdle http://msdn.microsoft.com/en-us/library/kcdbkyt4.aspx对你有什么帮助吗?或者我错过了重点? :)
Update
在 Twitter(或推文推文?)上与 Mendelt 闲聊之后,我认为我应该更新我的答案,以便社区充分了解。
-
WaitForInputIdle
仅适用于具有 GUI 的应用程序。
- 您指定等待的时间,如果进程在该时间范围内达到空闲状态,该方法将返回一个布尔值,如果需要,您显然可以使用它来循环,或根据需要进行处理。
希望有帮助:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)