为什么在ConfigureAwait(false)后可以触摸UI线程?
问题描述:
我正在沿斯蒂芬克莱里的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。那么这是如何工作的?
答
我想我已经想通了。该任务可以在ThreadPool线程上*完成。这允许阻止Wait()
在同一UI线程上恢复,并且在触摸TextBox时不会中断。
为了防止死锁,不要阻止'async'代码。您链接的文章使所有这些都非常清晰,阅读它。你应该'等待''WaitABit'而不是阻塞它。 – JSteward
@JSteward你应该更好地阅读我的问题。我知道如何“等待”,这只是一个实验。 – Gigi