线程休眠前未执行的代码
本文关键字:代码 执行 休眠 线程 | 更新日期: 2023-09-27 18:17:09
我这样做:
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秒,然后正确完成。
使用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线程上执行。
虽然让GUI线程进入睡眠状态是不可取的,但是允许GUI线程在进入睡眠状态之前刷新控件状态将显示您想要的更改。呼叫控制。更新或控制。在使其可见之后和进入睡眠之前刷新,以便GUI线程能够在进入睡眠之前显示更改。
clear();
coinRefundComplete.Visible = true;
label1.Update();
state = 0;
System.Threading.Thread.Sleep(4000);
clear();
使用Thread时要小心。在你的情况下,它是GUI线程,GUI在你睡觉的时候是无响应的。知道你想要阻塞线程的原因可以带来其他更好的建议。
编辑
您可以使用其他线程添加延迟,而不会阻塞GUI线程。如果你可以使用。net framework 4.5,那么你可以使用async/await结构,或者阅读这篇文章。net framework 4.5下使用async/await。
private async void testAsyncAwaitDely_Click(object sender, EventArgs e)
{
clear();
coinRefundComplete.Visible = true;
state = 0;
await Task.Delay(4000);
clear();
//Your code
}
更新[22-Apr-2018]:我没有删除这个答案,这样你就不会走错路,即使我的答案确实是一个可能的解决方案OP的问题(特别是当它花费了我一些负面的声誉)。你应该阅读下面的文章来真正说服自己为什么Application.DoEvents
不是解决这个问题的好方法:
- 应用程序的使用。DoEvents DoEvents是邪恶的吗?
你的UI没有刷新,因为你在UI线程上做你的整个处理,所以UI线程没有机会刷新UI元素。您需要在任何地方调用Application.DoEvents()
函数,在那里您需要刷新UI并加载最新的更改。这是你修改后的代码。在当前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;