我这样做:
clear();
coinRefundComplete.Visible = true;
state = 0;
System.Threading.Thread.Sleep(4000);
clear();
greeting.Visible = true;
rate.Visible = true;
refundTicket.Visible = true;
currentTime.Visible = true;
我希望coinRefundComplete
文本(它是一个标签)出现4秒,然后通过我用clear()定义的方法清除,然后发生其他一些事情。相反,在我使用第一个clear()清除我的表单后,我的表单空白4秒,然后正确完成。
答案 0 :(得分:11)
使用async/await
方法
制作方法async
- 以下是按钮点击的事件处理程序的示例
private async void ButtonClick(object sender, EventArgs e)
{
clear();
coinRefundComplete.Visible = true;
state = 0;
await Task.Delay(4000);
clear();
greeting.Visible = true;
rate.Visible = true;
refundTicket.Visible = true;
currentTime.Visible = true;
}
在线await Task.Delay(4000);
UI线程将被释放,这将更新之前所做的所有更改。 4秒后,方法将继续在UI线程上执行。
答案 1 :(得分:1)
尽管将GUI线程置于休眠状态是不可取的,但允许GUI线程在进入休眠状态之前刷新控件状态将显示您想要的更改。在使其可见并且在进入睡眠状态之后调用Control.Update或Control.Refresh,以便GUI线程能够在进入睡眠状态之前显示更改。
clear();
coinRefundComplete.Visible = true;
label1.Update();
state = 0;
System.Threading.Thread.Sleep(4000);
clear();
使用Thread.Sleep时应该小心,在你的情况下,它是GUI线程,GUI对你睡觉的时间没有反应。知道你想阻止线程的原因可以带来一些其他更好的建议。
修改强>
您可以使用其他线程来添加延迟而不会阻止GUI线程。如果您可以使用框架4.5,那么您可以使用async / await构造或阅读本文Using async/await without .NET Framework 4.5。
private async void testAsyncAwaitDely_Click(object sender, EventArgs e)
{
clear();
coinRefundComplete.Visible = true;
state = 0;
await Task.Delay(4000);
clear();
//Your code
}
答案 2 :(得分:-3)
更新[2018年4月22日] :我没有删除此答案,因此即使我的答案确实是 a,您也不会走错路 OP问题的可能解决方案(特别是当它给我带来一些负面声誉时)。您应该阅读以下帖子,以真正说服自己为什么Application.DoEvents
不是解决此问题的绝佳方法:
您的UI没有刷新,因为您正在UI线程上进行整个处理,因此UI线程没有任何机会刷新UI元素。您需要在任何需要刷新UI并加载最新更改的地方调用Application.DoEvents()
函数。这是您修改过的代码。我在当前UI线程上调用sleep之前添加了一行代码:
clear();
coinRefundComplete.Visible = true;
state = 0;
//new line of code
System.Windows.Forms.Application.DoEvents();
System.Threading.Thread.Sleep(4000);
clear();
greeting.Visible = true;
rate.Visible = true;
refundTicket.Visible = true;
currentTime.Visible = true;