我在我开发的C#WinForms应用程序中遇到了一个奇怪的“冻结”问题。以下是症状:
该程序将在看似随机的时间冻结GUI。这意味着不能选择任何UI元素。应用程序的窗口无法移动或调整大小。感觉就像顶部有一个看不见的模态对话框。
这是我到目前为止所发现的:
- 对GUI元素的代码调用将正常进行,但UI元素根本不会反映更改。
- Windows任务管理器不将我的应用分类为“无响应”。从这个角度看,一切都很正常,即使CPU使用率只有1-2%左右。所以我不是一个无限循环。
- 任何具体行动都不能引发问题,或者我还没有找到“规则”。我注意到当我使用屏幕截图工具(如“演示构建器”)时,问题似乎更快出现。但我不知道是否以及为什么这可能与我的问题有关。
- 问题不是由活跃的用户交互引起的。即使没有用户交互,它也可以随时发生。
- 除此之外,我还有一个每5秒运行一次的线程计时器,我的日志告诉我,即使在UI冻结开始后,计时器的elapsed方法也会被正常调用。因此,不是整个应用程序被阻止,只是UI。
- 当我附加调试器并暂停时,没有任何特殊情况可以观察到。它将在Application.Run()处中断。有几个线程,但所有线程都在“外部代码”上,所以我无法真正调试。
- 我的程序本身永远不会从冻结状态中恢复过来。它保持这种状态,除了一种情况:
- 当我在冻结后附加调试器,然后点击“暂停”并让程序处于暂停状态大约1-2分钟然后继续执行,UI冻结将奇迹般地消失!然后程序恢复正常,直到下一次冻结。
以下是我在应用中执行的一些特殊操作:
- 我在后台线程中等待TAPI调用(AddTAPI.NET组件)
并对来电做出反应。但我同步每个GUI的调用
使用Control.BeginInvoke
- 我有一个每5秒运行一次的线程计时器,我向WCF服务发送一条短信。基本上只是说“嗨,我还活着”
- 我使用WCF客户端/服务器与客户端回调接口通信。从服务器到客户端的一些调用导致GUI更新,但是
再次,我总是使用Control.BeginInvoke进行同步。距离
从那以后,即使没有特殊问题也会出现问题
从服务器到客户端的通信。
非常感谢任何想法在哪里或如何寻找这个奇怪问题的原因!