![]() |
1
90
起初,我想知道为什么运营商还没有将其中一个回答标记为答案,但在我自己尝试了之后,它仍然不起作用,我更深入地挖掘了一点,发现这个问题比我想象的要多得多。 通过阅读类似问题,可以更好地理解: Why won't control update/refresh mid-process 最后,对于记录,我可以通过执行以下操作来更新标签:
虽然据我所知,这远远不是一个优雅和正确的做法。这是一个可以工作也可以不工作的黑客,这取决于线程有多忙。 |
![]() |
2
14
呼叫
|
![]() |
3
13
呼叫
|
![]() |
4
4
我刚刚偶然发现了同一个问题,发现了一些有趣的信息,我想把我的两分钱放在这里,并把它加在这里。 首先,正如其他人已经提到的,长时间运行的操作应该由一个线程来完成,该线程可以是后台工作线程、显式线程、线程池中的线程或(自.NET 4.0以来)任务: Stackoverflow 570537: update-label-while-processing-in-windows-forms ,以便用户界面保持响应。 但对于短任务来说,虽然线程不会造成伤害,但实际上并不需要线程。 我创建了一个带有一个按钮和一个标签的WinForm来分析此问题:
我的分析是逐步跳过代码(使用F10)并查看发生了什么。读完这篇文章 Multithreading in WinForms 我发现了一些有趣的东西。文章在第一页的底部说,在当前执行的函数完成并且窗口被窗口标记为“不响应”之后,UI线程才能重新绘制UI。我还注意到,在我的测试应用程序中,从上面开始,在单步执行它的同时,但仅在某些情况下。
(对于以下测试,重要的是不要将Visual Studio设置为全屏,您必须能够在旁边同时看到您的小应用程序窗口,您不必在用于调试的Visual Studio窗口和应用程序窗口之间切换以查看发生的情况。启动应用程序,在
我的解释如下:afaik winform仍然使用winapi函数。阿尔索 MSDN article about System.Windows.Forms Control.Update method 指winapi函数wm_paint。这个 MSDN article about WM_PAINT 在其第一句中声明wm_paint命令仅在消息队列为空时由系统发送。但由于第二种情况下已经填写了消息队列,因此不会发送消息队列,因此标签和申请表也不会重新绘制。 <>笑话>结论:因此您只需防止用户使用鼠标即可;-)<gt;/jokey> |
![]() |
5
3
你可以试试这个
看看它是否有效。 |
![]() |
6
2
更新用户界面后,启动要使用长时间运行操作执行的任务:
这在.NET 3.5及更高版本中有效。 |
![]() |
7
1
想要“修复”这个问题并强制用户界面更新是非常诱人的,但是最好的解决方法是在后台线程上执行此操作,而不是绑定用户界面线程,这样它仍然可以响应事件。 |
![]() |
8
1
尝试调用label.invalidate()。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invalidate(VS.80).aspx |
![]() |
9
1
我想我得到了答案,从上面提炼出来,并做了一些实验。
我尝试减小值,即使在调试模式下屏幕也会更新,但这对设置不起作用。
有了这个结果,我甚至不需要
|
![]() |
10
0
我对财产也有同样的问题
|
![]() |
11
0
如果只需要更新几个控件,.update()就足够了。
|
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |