Application.Run(表单)挂起



我遇到了一个非常奇怪的情况。我们有一个相对较大的应用程序(约50万行代码),在过去6年中由超过10名不同的开发人员开发。在我们最近发布之前,它一直运行良好。对于最新版本,我们有多个客户抱怨它偶尔会挂起,我们很难弄清楚如何挂起/为什么挂起!以下是一些使调试具有挑战性的因素:

  • 直到今天早上,我们还完全无法在家里重现这个问题
  • 我们从未见过在附加调试器时发生这种情况!这显然使其难以解决
  • 当人们使用该应用程序时,这种情况往往不会发生,而是在他们停止使用一段时间后
  • 这(可能)与即将启动的屏幕保护程序有关吗
  • 在更改屏幕分辨率时,这种情况似乎一直存在

今天早上,我们终于想出了如何在家里重现至少一个场景:-在调试器之外运行该应用程序-更改屏幕分辨率。这会挂起应用程序。-然后我们可以使用调试器进行附加。

然而,问题是(现在我们可以,至少在一种情况下,复制它)我们的代码在挂起时没有运行!换句话说,在挂起时只有一个线程在运行,它中断的行是Application.Run(表单);来自程序.cs.

最后一点是应用程序没有被完全挂起。具体而言:-它仍然进行屏幕绘制(例如刷新其他应用程序覆盖的部分屏幕)-我无法点击显示的UI元素,但它也不会像我预期的那样"嘟嘟"作响,如果它完全没有响应的话-当我在附加调试器后"暂停"应用程序时,我可以在暂停时最小化/最大化它。否则,它将不会响应最小化/最大化命令。-除了不向我发出哔哔声外,它的行为就像屏幕外有一个我看不见的模式窗口。另外(如前所述),当我暂停应用程序时,它会暂停在Application.Run行,并且线程列表中没有其他线程/代码运行(正如我所期望的那样,如果有模式对话框阻塞主窗口。

这种行为是最奇怪的IMHO——尤其是因为它是最近才开始发生的。我的下一步必须开始"减去"代码的部分,直到我找到罪魁祸首,但我想我会先把问题扔到这里,看看其他人以前是否经历过这样的事情。

提前感谢您的指导-我期待着听到任何建议。

ej

编辑:陈述行为的另一种方式。在它"挂起"之后,它的行为就像没有问题一样,只是它没有收到来自我的鼠标和键盘的消息。换句话说,它仍然会重新绘制自己,并且可以由VS2010调试器暂停,但不会以任何形状或形式对鼠标/键盘事件做出响应。不过,在这里,它不会像对待其他真正死了的应用程序那样开始对我发出哔哔声。类似地,它不会在任务管理器中显示为无响应。这只是一种奇怪的"对不起,我不再听I/O了!"状态。。。奇怪的

编辑:

在我的上一次编辑中,我提到它不再接受IO。这让我有了这样的想法,我添加了一个TcpListener,看看它在"挂起"后是否还会响应——它确实会响应。此外,考虑到它仍然会更新屏幕,我在paint事件中设置了一个断点,并得到了一些(更)奇怪的行为。它到达绘制事件中的断点,但此时不在调用堆栈的顶部。调用堆栈的顶部显示"In sleep,wait or join"。然后油漆中的行是下一行,然后是外部代码,然后是主代码。因此,屏幕上突出显示的线是绿色,而不是黄色。此外,如果我F10(跨接),它确实如此,正好向下移动了1行,但pain方法仍然不在调用堆栈的顶部。在这一点上,没有其他线程在运行,没有其他代码在执行,没有其他事情发生?!?!这是怎么回事?

最后一点-我在TcpListener的Accept Socket事件中设置了一个断点,当我连接到TCP/IP端口时,它会中断该代码,而该代码位于调用堆栈的顶部。

对不起,但我还是很困惑。

您可能对在非UI线程上创建的控件(或其句柄)有问题,请检查此问题。

最新更新