【问题标题】:GUI does not redraw while stepping in Debug Mode进入调试模式时 GUI 不会重绘
【发布时间】:2013-03-06 18:23:57
【问题描述】:

在任何 .NET 2.0 Winforms 应用程序中,如果您在调试模式下运行代码,并且您遇到断点或以其他方式逐行进入代码,并且您希望查看正在调试的应用程序的 GUI,那么.NET 不绘制应用程序屏幕。

例如,我有一个将一些消息写入表单上的文本框的应用程序。当我逐步调试代码时,或者遇到断点时,我想查看 TextBox 中记录的所有消息,但是如果我按 Alt-Tab 从 VS2005 窗口切换到 WinForms 应用程序窗口,我看到的都是是白色。表格不会重绘,直到您在 VS2005 的调试模式下按 F5。

这是什么原因,有没有办法克服这个问题,而不在代码中引入任何线程?

【问题讨论】:

  • 当你进入你的进程时,所有线程都被挂起,所以没有消息被泵送。您最好使用Debug.WriteLine 写入调试输出并观察那里出现的内容而不必中断。
  • 当然,调试器冻结了 UI 线程。在您恢复运行之前,该窗口不会更新。稍后,当 UI 线程再次空闲并获取绘制请求时。这是设计使然。
  • @vcsjones: 是的,但是当您跨过它们时,任何不通过消息泵的事情(例如对 OnPaint() 的调用)会不会在调试器中同步发生?
  • 我想这完全取决于您要调试的是否是 UI 渲染问题。

标签: c# .net winforms .net-2.0


【解决方案1】:

这是什么原因

在调试时,您实际上是在阻塞 UI 线程 - 您是在手动单步执行其执行流程。 UI 线程在您停止执行时无法绘制 UI。

有没有办法克服这个问题

您可以尝试手动调用Application.DoEvents(),但我通常建议不要这样做。

最好等到方法结束,然后让 UI 正常重绘自身。如果您的方法很长(就时间而言),那么请记住,当 not 调试时,UI 仍然无法在该方法执行时自行更新。这可能会导致您更改设计(仅从我们目前获得的信息很难判断)。

【讨论】:

  • 如果被挂起,任何线程如何调用Application.DoEvents()?你的意思是从即时窗口?
【解决方案2】:

这是因为您只能拥有一个 UI 线程,并且当您输入更新该代码的方法时,该代码开始阻塞 UI 线程。在您的方法退出之前,它不会更新。

Here is a good SO on message pumps,这是推动 UI 更新的原因

您应该能够在调试时使用Add Watch/Quick Watch 查看任何值。无论如何,这听起来像是您真正想要的。

【讨论】:

    【解决方案3】:

    就像其他人在答案和 cmets 中所说的那样,UI 线程被阻塞,因此无法重绘。

    但是,如果您只想查看 GUI,而不与它进行交互,并且您正在运行 Windows 7/8(这听起来不太可能,因为您使用的是 VS2005)并且没有没有禁用 aero peek,您可以将鼠标悬停在任务栏中的应用程序上,Windows 将显示预览缩略图。当您将鼠标悬停在缩略图上时,即使断点阻塞了 UI 线程,您也可以“窥视”应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多