2015-10-30 61 views
0

在我的应用程序中有一个父进程,它会产生子进程。我试图利用这个父进程来监视孩子,以确保GUI保持响应,如果没有,生成一个转储文件。检测子进程是否挂起父进程

我遇到的问题是Process.Responding只能检测一些图形用户界面挂起(例如在GUI线程或堆栈溢出)而不是其他(例如GUI线程上的死锁)。

所以问题是:我还能如何检查孩子的GUI是否仍然从父进程更新?

编辑:基于迄今为止的意见,我想我应该澄清。我负责使用插件体系结构来维护应用程序的框架,该插件体系结构非常多线程,并且拥有数十万行代码的代码库,其中大部分代码不受我控制。虽然我理解理想的方法不是首先挂起,但它偶尔也会发生。我希望能够平稳地收集这些情况并收集调试信息,以便解决问题。

我考虑的另一种方法是使用GUI线程来触摸文件,并让父进程检查文件的时间戳。但是,我宁愿不在GUI线程上执行文件操作。

+2

如果您使用多个线程,请尝试使用异步并等待与“主线程”不相关的进程。 – darkndream

+1

为什么在UI线程上运行代码可能会死锁?如果您必须在您的程序中创建一个程序来监视它是否挂起,这是一个不好的迹象。 – Loathing

+0

我总是使用log4net进行日志记录。它显示时间戳和线程号,以便您知道您在哪个过程中停留。 https://logging.apache.org/log4net/release/example-apps.html –

回答

1

几失败后与我上面提到的战略企图,这里就是我结束了解决这个:

  1. 在孩子申请开始我保存到GUI线程
  2. 开始计时,一个参考定期检查 GUI线程的线程状态(大约每200ms)。如果它是ThreadState.Running,则我通过 进程间通信报告进程作为对父进程的响应。
  3. 在父进程中,我保存进程ID 的字典以及进程上次报告为响应的时间。如果一个 孩子仍然存活但尚未在 超时期内报告响应结果,则会通知用户该过程不是 响应。

到目前为止,一切似乎都按照我预期的那样工作。