Task.Delay()发布UI线程?

时间:2017-02-15 18:40:15

标签: c# multithreading winforms task-parallel-library

有人可以向我解释为什么这段代码不能阻止用户界面?我没有创建任何新的线程/任务和应用程序只是工作正常。

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;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

  

我没有创建任何新的线程/任务

好吧,有点...... Task.Delay 创建一个新任务 - 一个在5秒后完成的任务。

然后,您的代码会在该任务上调用awaitTest1返回。有关await工作原理的详细信息,请参阅我的async intro

在这5秒内,你的UI线程可以自由地做其他工作(比如响应用户输入)。在这5秒结束时,从Task.Delay返回的任务完成,UI线程继续执行Test1

旁注,你应该避免async void;通常,只对事件处理程序使用async void。有关详细信息,请参阅我在async best practices上的文章。