为什么我可以在ConfigureAwait(false)之后触摸UI线程?

时间:2017-10-07 14:26:06

标签: wpf async-await deadlock

我正在按照Stephen Cleary的deadlock example进行实验。

使用以下代码,我使用ConfigureAwait(false)来规避死锁(这不是一个好习惯,只是为了演示):

    private Uri uri = new Uri("http://ip.jsontest.com/");

    public async Task WaitABit()
    {
        await Task.Delay(3000).ConfigureAwait(false);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var task = WaitABit();
        task.Wait();
        textbox.Text = "aa";
    }

根据我的理解,ConfigureAwait(false)可以防止死锁,因为未捕获SynchronizationContext,因此可以在免费的ThreadPool线程上进行延续。

但是,据我所知,ThreadPool线程无法直接触摸UI。那这怎么工作呢?

1 个答案:

答案 0 :(得分:1)

我想我已经明白了。该任务可以在ThreadPool线程上自由完成。这允许阻塞Wait()在同一个UI线程上恢复,并且在接触TextBox时不会中断。