2012-10-08 3 views
12

In WPF 4.5 applicazione, non capisco il motivo per cui l'interfaccia utente è bloccato quando ho usato await + un compito:mio asincrona Task sempre blocchi UI

private async void Button_Click(object sender, RoutedEventArgs e) 
    { 
     // Task.Delay works great 
     //await Task.Delay(5000); 

     double value = await JobAsync(25.0); 

     MessageBox.Show("finished : " + value.ToString()); 
    } 

    private async Task<double> JobAsync(double value) 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    } 

La attendono Task.Delay grandi opere, ma la Attendere JobAsync blocca l'interfaccia utente. Perché ? Grazie.

risposta

9

Prova questo:

private Task<double> JobAsync(double value) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    }); 
} 
+2

Invece di iniziare il compito all'interno del metodo potrebbe avere più senso di aggiungere una chiamata 'Task.Run' sulla linea con' await', anche se il risultato finale (se la funzione non viene mai riutilizzata) è identico. – Servy

+2

Im in uno scenario simile, blocca ancora il thread dell'interfaccia utente. Ci sono trucchi ovvi? – IbrarMumtaz

23

si dovrebbe essere sempre un avvertimento circa JobAsync - non contiene await espressioni. Tutto il il tuo lavoro è ancora in corso sul thread dell'interfaccia utente. Non c'è davvero nulla di asincrono sul metodo.

Contrassegnare un metodo come async non lo fa girare su un thread diverso - è più che rende più facile unire operazioni asincrone e tornare al contesto appropriato.

ho il sospetto che sarebbe una buona idea di fare un passo indietro e assorbire alcuni dei materiali circa asincrona su MSDN ... this is a good starting point ...

+0

Ok grazie, ora capisco :) – Nico