C# 在调试模式下单步执行时,GUI不会重新绘制

C# 在调试模式下单步执行时,GUI不会重新绘制,c#,.net,winforms,.net-2.0,C#,.net,Winforms,.net 2.0,在任何.NET 2.0 Winforms应用程序中,如果在调试模式下运行代码,并点击断点或逐行进入代码,并且希望看到正在调试的应用程序的GUI,则.NET不会绘制应用程序屏幕 例如,我有一个应用程序,它将一些消息写入表单上的文本框。当我一步一步地调试代码时,或者当遇到断点时,我想查看文本框中记录的所有消息,但是如果我按Alt Tab键从VS2005窗口切换到WinForms应用程序窗口,我看到的只是白色。在VS2005的调试模式下按F5键之前,不会重新绘制表单 原因是什么?有没有办法克服这个问题

在任何.NET 2.0 Winforms应用程序中,如果在调试模式下运行代码,并点击断点或逐行进入代码,并且希望看到正在调试的应用程序的GUI,则.NET不会绘制应用程序屏幕

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


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

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

,哪些是驱动UI更新的因素

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

这是什么原因

在调试过程中,您有效地阻止了UI线程—您正在手动执行它的执行流。当您停止UI执行时,UI线程无法绘制UI

有没有办法克服这个问题

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


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

正如其他人在回答和评论中所说,UI线程被阻止,因此无法重新绘制


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

当您进入进程时,所有线程都将挂起,因此不会发送任何消息。您最好使用
Debug.WriteLine
写入调试输出并观察那里出现的内容,而不必中断。当然,UI线程已被调试器冻结。在您恢复运行之前,窗口不会更新。稍后,当UI线程再次空闲并获得绘制请求时。这是经过设计的。@vcsjones:是的,但是如果没有通过消息泵,比如对OnPaint()的调用,那么当您跨过它们时,调试器中的任何事情都会同步发生。我想这一切都取决于您试图调试的内容是否是UI呈现问题。任何线程如何调用
Application.DoEvents()
是否已暂停?你是说直接从窗口看?