2013-08-30 18 views
5

ho letto un po 'su async/await e stava cercando di riprodurre uno scenario di stallo su Windows Form chiamando WebClient.DownloadStringTaskAsync sul thread dell'interfaccia utente e quindi chiamando task.Result sul thread dell'interfaccia utente, mentre l'attività è stata esecuzione . Ciò ha provocato un punto morto.ConfigureAwait (false) deadlock ancora

Quindi ho tentato di risolvere il problema chiamando lo ConfigureAwait(false) sull'attività restituita, ma con mia sorpresa ha comunque causato un deadlock. La mia comprensione è che dovrebbe eseguire la continuazione del metodo su un thread diverso e quindi non ci dovrebbero essere deadlock. Cosa mi manca?

So come aggirare il problema ma ho pensato che ConfigureAwait(false) avrebbe risolto il problema.

Ecco il codice, sto usando NET 4,5

private async void button1_Click(object sender, EventArgs e) 
    { 
     // Deadlocks! 
     Task<string> task = DownloadAsync(); 
     textBox1.Text = task.Result; 

     // Works 
     //textBox1.Text = await DownloadAsync(); 
    } 

    private static async Task<string> DownloadAsync() 
    { 
     var client = new WebClient(); 

     string result = await client.DownloadStringTaskAsync("http://www.rpmglobal.com").ConfigureAwait(false);   

     return result; 
    } 

risposta

10

WebClient sarà ancora causare questa situazione di stallo a causa DownloadStringTaskAsync è solo un wrapper per le EAP metodi, che sempre aumentare il loro evento nel contesto originale. Non c'è modo di disattivarlo.

Provare a utilizzare HttpClient (o qualcosa di semplice come Task.Delay) per vedere la differenza.

Problemi correlati