检测子GUI是否挂起父进程

时间:2015-10-30 21:11:49

标签: c# .net winforms

在我的应用程序中,有一个父进程生成其子进程。我正在尝试利用此父进程来监视子进程以确保GUI保持响应,如果没有,则生成转储文件。

我遇到的问题是Process.Responding仅检测到一些GUI挂起(例如在GUI线程上休眠或堆栈溢出)而不检测其他GUI挂起(例如GUI线程上的死锁)

所以问题是:我怎么能检查孩子的GUI是否仍在从父进程更新?

编辑:根据迄今为止的评论,我想我应该澄清一下。我负责使用大量多线程的插件架构来维护应用程序的框架,并且代码库有数十万行代码,其中大部分代码都在我无法控制的范围内。虽然我理解理想的方法不是首先挂起,但它仍然偶尔发生。我希望这些情况优雅,并在此过程中收集调试信息,以便解决问题。

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

1 个答案:

答案 0 :(得分:1)

在我上面提到的策略尝试失败之后,以下是我最终解决这个问题的方法:

  1. 在子应用程序启动时,我保存对GUI线程的引用
  2. 启动定时器,定期检查线程的状态 GUI线程(大约每200ms)。如果是ThreadState.Running,我 报告该过程以响应父母通过 进程间通信。
  3. 在父进程中,我保留了进程ID的字典 以及该流程上次报告为响应的时间。如果一个 孩子还活着,但没有报告内部的回应结果 超时期限,通知用户该进程不是 响应。
  4. 到目前为止,一切似乎都在按照我的预期进行。