有人可以向我解释为什么这段代码不能阻止用户界面?我没有创建任何新的线程/任务和应用程序只是工作正常。
private void button1_Click(object sender, EventArgs e)
{
Test1();
}
private async void Test1()
{
var random = new Random();
while (true)
{
try
{
textBox1.Text = random.Next(1, 100).ToString();
textBox2.Text = random.Next(1, 100).ToString();
await Task.Delay(5000);
}
catch (Exception)
{
break;
throw;
}
}
}
答案 0 :(得分:3)
我没有创建任何新的线程/任务
好吧,有点...... Task.Delay
会创建一个新任务 - 一个在5秒后完成的任务。
然后,您的代码会在该任务上调用await
,从Test1
返回。有关await
工作原理的详细信息,请参阅我的async
intro。
在这5秒内,你的UI线程可以自由地做其他工作(比如响应用户输入)。在这5秒结束时,从Task.Delay
返回的任务完成,UI线程继续执行Test1
。
旁注,你应该避免async void
;通常,只对事件处理程序使用async void
。有关详细信息,请参阅我在async
best practices上的文章。