2017-10-07 136 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時不會中斷。

相關問題