我正在编写一个应用程序来启动和监视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流程?
是不是Process.WaitForInputIdle对你有任何帮助?或者我错过了这一点?:)
在Twitter(或推文推文?)与门德尔聊天之后,我想我应该更新我的答案,以便社区充分了解..
WaitForInputIdle
仅适用于具有GUI的应用程序.
您指定等待的时间,如果进程在该时间范围内达到空闲状态,则该方法返回bool,显然,如果需要,您可以使用它循环,或者根据需要进行处理.
希望有帮助:)