我有一个 WPF 监控应用程序,它使用单独的(内部开发的)C# 测试基础结构来执行测试并监控和记录结果。我还使用商业软件包 (InGear) 与 PLC 通信。结果,应用程序有很多线程(其中大部分是由我使用的工具创建的)。
由于环境的性质,在目标环境中使用调试器会非常困难;所以,我们都使用log4net来记录诊断。
我在外部调用周围使用 try/catch 块,并且还在 WPF 和 AppDomain 级别设置了未处理的异常处理程序。
在我们第一次长期运行期间,应用程序似乎变得无响应,我得到了标准的“无响应”对话框。看着日志,似乎一切都停止了。例如:我可以从日志中看到DispatcherTimer设置为在 1 秒内响应主线程;但是,从来没有。
所以....我的问题是:
- 如何检测挂起或被 Window 检测到我挂起?请注意,我假设它可能是一个更高优先级的线程阻塞了我的 UI 线程;所以,我可能无法回复 Windows 消息。
- 一旦我进入,我如何找出罪魁祸首。能够记录其调用堆栈将是一个很大的优势。