【发布时间】:2014-09-20 05:18:21
【问题描述】:
在从另一个问题中阅读this answer 时,我 100% 确信以下代码会锁定 UI 并且不会导致任何移动。
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 5; i++)
{
this.Left += 10;
System.Threading.Thread.Sleep(75);
this.Left -= 10;
System.Threading.Thread.Sleep(75);
}
}
我和 cmets 中的其他几个人说它不起作用,但 OP 坚持认为它起作用了,我们应该尝试。我最终创建了一个新的 Winforms 项目,添加了一个按钮,然后将上述代码放入事件处理程序中进行点击,表单确实发生了抖动。
当消息泵被此方法阻塞时,表单如何移动,OnPaint 应该无法在表单或其任何子控件上调用,这是如何工作的?
【问题讨论】:
-
即使不触发
Paint,表单也可以移动。这仍然是个坏主意。 -
@SLaks 我并不是说这是一个好主意,我只是想知道到底发生了什么让这项工作发挥作用。
-
某处可能有
DoEvents或某种道德等价物。 -
我相信 Windows 会存储您窗口的“屏幕截图”,即使消息泵没有响应,仍然允许移动发生。最终,窗口可能会变灰,并显示应用程序未响应的消息。
-
这就是我问这个问题的原因,我想到了和以前的 cmets 一样的“也许”和“某事”,我只是不确定答案。我问了这个问题,以便更详细地了解到底发生了什么。