2012-10-08 30 views
12

En una aplicación de WPF 4.5, no entiendo por qué la interfaz de usuario se bloquea cuando utilicé esperan ser una tarea +:Mi tarea asíncrona siempre bloques de la interfaz de usuario

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

El esperan Task.Delay funciona muy bien, pero la Aguardar JobAsync bloquea la interfaz de usuario. Por qué ? Gracias.

Respuesta

9

Prueba esto:

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

En lugar de empezar la tarea dentro del método podría tener más sentido para agregar una llamada 'Task.Run' en la línea con' await', aunque el resultado final (si la función nunca se vuelve a utilizar) es idéntico. – Servy

+2

Im en un escenario similar, todavía bloquea el subproceso UI. ¿Hay algún inconveniente obvio? – IbrarMumtaz

23

que debería estar recibiendo una advertencia sobre JobAsync - que no contiene await expresiones. Todo su trabajo todavía se está haciendo en el hilo de la interfaz de usuario. Realmente no hay nada asincrónico sobre el método.

Marcar un método como async no hace que se ejecute en un hilo diferente - es más que facilita la unión de operaciones asincrónicas, y vuelve al contexto apropiado.

sospecho que sería una buena idea para dar un paso atrás y absorber algunos de los materiales sobre asíncrono en MSDN ... this is a good starting point ...

+0

Ok gracias, ahora lo entiendo :) – Nico

Cuestiones relacionadas