我正在按照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。那这怎么工作呢?
答案 0 :(得分:1)
我想我已经明白了。该任务可以在ThreadPool线程上自由完成。这允许阻塞Wait()
在同一个UI线程上恢复,并且在接触TextBox时不会中断。