【问题标题】:Application.Run(form) is hangingApplication.Run(form) 挂起
【发布时间】:2012-07-20 19:21:34
【问题描述】:

我有一个很奇怪的情况。我们有一个相对较大的应用程序(约 50 万行代码),由超过 10 位不同的开发人员在过去 6 年中开发。在我们最近发布之前,它一直运行良好。使用最新版本,我们有多个客户抱怨它偶尔会挂起,我们正在花时间弄清楚如何/为什么!以下是一些使调试变得困难的事情:

  • 直到今天早上,我们还完全无法在内部重现此问题。
  • 在附加调试器时,我们从未见过这种情况!这显然使解决问题变得具有挑战性。
  • 这种情况往往不会在人们使用应用程序时发生,而是在他们停止使用一段时间后发生。
  • 这(可能)与屏幕保护程序启动有关吗?
  • 在更改屏幕分辨率时似乎总是发生这种情况

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

但问题是(现在我们至少可以在一种情况下重现它)是我们的代码在挂起时没有运行!换句话说,它挂起的时候只有一个线程在运行,它中断的行是Application.Run(form);来自program.cs。

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

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

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

ej

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

编辑:

在我上次的编辑中,我提到它不再接受 IO。这让我这么想,我添加了一个 TcpListener 来查看它在“挂起”后是否仍会响应 - 它确实如此。此外,考虑到它仍然会更新屏幕这一事实,我在绘制事件中设置了一个断点并得到了一些(更多)奇怪的行为。它在绘制事件中命中断点,但此时不在调用堆栈的顶部。调用堆栈的顶部显示“处于睡眠状态,等待或加入”。接下来是paint中的行,然后是外部代码,然后是main。所以屏幕上突出显示的行是绿色的 - 不是黄色的。此外,如果我按 F10(跳过),它确实会向下移动 1 行,但疼痛方法仍然不在调用堆栈的顶部。此时,没有其他线程在运行,没有其他代码在执行,没有其他任何事情发生?!?!这是怎么回事?

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

抱歉 - 但我还是很困惑。

【问题讨论】:

  • 挂起时CPU负载高吗?
  • 而.net framework 版本是?您使用的是 wpf 还是 winforms?
  • 没有 CPU 活动。 v3.5。我在最近的一次编辑中添加了对该问题的附加描述,您关于 CPU 的问题与该附加描述直接一致。它根本没有(至少据我所知)陷入无限循环或任何事情。它什么也没做——这就是整个问题。它只是不再听 IO 请求(键盘/鼠标)......
  • 有趣的是,您在这篇文章中根本没有提到 DoEvents...如果 DoEvents 永远不会返回,那就可以解释为什么 Application.Run “挂起”...
  • 使用调试器向上遍历堆栈以查看在 DoEvents 上循环的事件。顺便说一句:这整个问题是一个很好的论据 never use DoEvents()

标签: c# .net windows-7 frameworks


【解决方案1】:

您可能对在非 UI 线程 check this question 上创建的控件(或其句柄)有问题。

【讨论】:

  • 这就是原来的样子!!!非常感谢你!!!在另一篇文章中引用的一篇文章中,它提到在另一个线程上创建 UI 元素。以下是导致这种非常集市行为的事件序列,以防其他人在未来遇到这种类型的事情!
  • 1) 为确保 SSRS 服务正在运行,当我们的应用启动时,它会生成一个工作线程来连接到报告服务。 2)它曾经使用报表查看器的WebForms版本来连接到一个报表。 3) 6 月 12 日,我们的一位开发人员无意中更改了一行:使用 Microsoft.Reporting.WebForms 为 Microsoft.Reporting.WinForms。这导致线程在非 UI 线程上创建 WINDOWS ReportViewer 以建立此初始连接。 95%的时间,没有问题。这里描述的所有行为,都源于这一单词的变化!再次感谢你们!
  • 尝试this 答案中的函数以找出在错误线程上创建的特定控件。
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多