2017-10-07 8 views
-1

Stephen Cleary의 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

deadlock을 방지하려면 단순히 'async' 코드를 차단하지 마십시오. 링크 한 기사를 통해 매우 명확하게 읽을 수 있습니다. 당신은'WaitABit'을 블로킹하는 대신 '기다려야한다'. – JSteward

+0

@JSteward 제 질문을 더 잘 읽어야합니다. 나는 '기다리는 법'을 안다. 이것은 단지 실험 일 뿐이다. – Gigi

답변

1

나는 그것을 이해했다고 생각합니다. 이 작업은 ThreadPool 스레드에서 완료 할 수 있습니다. 이렇게하면 블로킹 Wait()이 동일한 UI 스레드에서 다시 시작될 수 있으며 TextBox에 닿으면 중단되지 않습니다.