2017-10-07 10 views
-1

J'expérimente le long des lignes de deadlock example de Stephen Cleary.Pourquoi puis-je toucher le fil de l'interface utilisateur après ConfigureAwait (false)?

Avec le code suivant, je suis contournent l'impasse à l'aide ConfigureAwait(false) (pas une bonne pratique, mais juste pour la démonstration):

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"; 
    } 

Selon ma compréhension, ConfigureAwait(false) empêche l'impasse parce que le SynchronizationContext n'est pas capturé , et ainsi la continuation peut se produire sur un thread ThreadPool libre. Toutefois, pour autant que je sache, un thread ThreadPool ne peut pas toucher directement l'interface utilisateur. Alors, comment ça marche?

+1

Pour éviter le blocage, ne bloquez pas le code 'async'. L'article auquel vous avez fait un lien rend tout cela très clair, lisez-le. Vous devriez attendre WaitABit au lieu de bloquer dessus. – JSteward

+0

@JSteward Vous devriez mieux lire ma question. Je sais comment «attendre», c'était juste une expérience. – Gigi

Répondre

1

Je pense que je l'ai compris. La tâche est libre de terminer sur un thread ThreadPool. Cela permet au blocage Wait() de reprendre sur le même thread d'interface utilisateur et il ne casse pas lorsqu'il touche la zone de texte.