线程休眠前未执行的代码

本文关键字:代码 执行 休眠 线程 | 更新日期: 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;