c# - Application.Run(窗体)挂起

标签 c# .net windows-7 frameworks

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


直到今天早上,我们完全无法在内部重现此问题。
当连接调试器时,我们从未见过这种情况!这显然使其具有挑战性。
当人们使用该应用程序时,通常不会发生这种情况,而是在他们停止使用一段时间后。
这可能与屏幕保护程序有关吗?
更改屏幕分辨率时,似乎有些一致的情况


今天早上,我们终于想出了如何通过以下方式在内部复制至少一种场景:
 -在调试器之外运行该应用
 -更改屏幕分辨率。这会挂起应用程序。
 -然后,我们可以附加调试器。

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

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

行为是最奇怪的恕我直言-特别是因为它是最近才开始发生的。我的下一步将是开始“减去”代码部分,直到找到罪魁祸首,但我认为我首先要在这里提出问题,然后看看是否有人曾经历过类似的事情。

在此先感谢您的指导-我期待听到任何建议。

j

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

编辑:

在上一次编辑中,我提到它不再接受IO。这让我开始思考,我添加了一个TcpListener来查看它在“挂起”后是否仍会响应-并且确实如此。另外,考虑到它仍然会更新屏幕这一事实,我在绘画事件中设置了一个断点,并得到了一些(更多)奇怪的行为。它会在paint事件中达到断点,但此时不在调用堆栈的顶部。调用堆栈的顶部显示“正在睡眠,等待或加入”。然后是paint行,然后是外部代码,然后是main。因此,屏幕上突出显示的行是绿色-而不是黄色。此外,如果I F10(跳过)执行,则只向下移动1行,但是,痛苦方法不在调用堆栈的顶部。此时,没有其他线程在运行,没有其他代码在执行,什么都没有发生?!?!这里发生了什么?

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

抱歉-但是我还是很困惑。

最佳答案

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

关于c# - Application.Run(窗体)挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11585703/

相关文章:

C# WPF Rating 控件类似于 Wifi 信号指示器

c# - C#中的自动编码检测

windows-7 - window 7 : "Excel found unreadable content"

c# - CaSTLe Windsor - 一个接口(interface)的多重实现

c# - 不可访问的内部资源文件?

c# - 以像素为单位获取字体指标

c# - Windows 窗体设计器和通用窗体

c# - 有任何 ORM 可以为高速批量插入提供不错的方法吗?

Python 和 Py2Exe : "%1 Is Not A Valid Win32 Application"

asp.net - 在使用 Windows Auth 的 Windows 7 上使用 VS 2008 的调试 Web 服务器时,User.IsInRole 失败