例如,我有几行代码:
MessageBox.Show("1");
Sleep(1000);
MessageBox.Show("2");
Sleep(1000);
MessageBox.Show("3");
并且我想在不使用Thread.Sleep
的情况下继续下一行代码之前先暂停一秒钟;因为它冻结了整个Form并终止了应该在休眠代码之前执行的代码行。我不为此使用消息框,仅以示例为例,我知道它可以与之配合使用。
我最初使用的行不起作用。在继续运行代码之前,还有其他选择等待1s吗?谢谢。
答案 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
}