如何不使用Thread.Sleep()暂停执行

时间:2019-05-09 09:37:25

标签: c# winforms wait

例如,我有几行代码:

MessageBox.Show("1");

Sleep(1000);

MessageBox.Show("2");

Sleep(1000);

MessageBox.Show("3");

并且我想在不使用Thread.Sleep的情况下继续下一行代码之前先暂停一秒钟;因为它冻结了整个Form并终止了应该在休眠代码之前执行的代码行。我不为此使用消息框,仅以示例为例,我知道它可以与之配合使用。

我最初使用的行不起作用。在继续运行代码之前,还有其他选择等待1s吗?谢谢。

2 个答案:

答案 0 :(得分:3)

是的,使您的方法异步并使用await Task.Delay(1000)

public async Task MyAsyncMethod()
{
    //Action 1  
    await Task.Delay(1000);

    //Action 2  
    await Task.Delay(1000);


    //Action 3  
    await Task.Delay(1000);
}

编辑:

如果使用Winforms,则此异步模式必须转到层次结构中的highes方法。因此,假设您确实有一个想要单击此方法的按钮单击事件。然后,必须使click方法异步!

private async void button2_Click(object sender, EventArgs e)
{
    Console.WriteLine("STUFF Before");
    await MyAsyncMethod();
    Console.WriteLine("STUFF @ the END");
}

public async Task MyAsyncMethod()
{
    //Action 1  
    Console.WriteLine("Action 1 ");
    await Task.Delay(1000);

    //Action 2  
    Console.WriteLine("Action 2 ");
    await Task.Delay(1000);


    //Action 3  
    Console.WriteLine("Action 3 ");
    await Task.Delay(1000);
}

要实现这一点,您需要将MyAsyncMethod的返回类型声明为Task

public async Task MyAsyncMethod()    
               ^
               !

答案 1 :(得分:2)

编辑:

在回复中发表评论后,最好的解决方案是使用await Task.Delay(time);

private async void AsyncMethod()
{
    //do what you want here
    await Task.Delay(1000);
}

这种方式很糟糕,就像@MickyD在他的评论中所说的那样:

  

这会使您的GUI应用程序重新进入。这是对Visual Basic 6和不良编码习惯的一种抛弃。

int seconds = 2;
if (seconds < 1) return;
DateTime _desired = DateTime.Now.AddSeconds(seconds);
while (DateTime.Now < _desired)
{
   System.Windows.Forms.Application.DoEvents();
   //do whatever you want in this 2 seconds
}