2017-10-07 219 views
-1

我正在沿斯蒂芬克莱里的deadlock example的方向进行实验。为什么在ConfigureAwait(false)后可以触摸UI线程?

用下面的代码,我绕过使用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

为了防止死锁,不要阻止'async'代码。您链接的文章使所有这些都非常清晰,阅读它。你应该'等待''WaitABit'而不是阻塞它。 – JSteward

+0

@JSteward你应该更好地阅读我的问题。我知道如何“等待”,这只是一个实验。 – Gigi

回答

1

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

相关问题