2010-09-21 19 views
9

Hola, normalmente haría esto con un Background Worker, pero me gustaría hacerlo con C# Task en su lugar, solo para entender mejor Task.Ejecutando múltiples C# Task Async

La cosa es que tengo una clase con las siguientes propiedades

private int _number1; 
    public int Number1 
    { 
     get { return _number1; } 
     set { _number1 = value; OnPropertyChanged("Number1");} 
    } 

    private int _number2; 
    public int Number2 
    { 
     get { return _number2; } 
     set { _number2 = value; OnPropertyChanged("Number2");} 
    } 

Tenga en cuenta que yo uso el INotifyPropertyChanged.

Number1 = Task<int>.Factory.StartNew(() => GenerateResult()).Result; 
Number2 = Task<int>.Factory.StartNew(() => GenerateResult2()).Result; 

El GenerateResult y GenerateResult2 son sólo métodos Dumme, que duerme y luego devuelven un número.

¿Cómo puedo hacer que esto funcione Async? Desde ahora, se llama primero a GenerateResult2() cuando finaliza GenerateResult().

Lo necesito para poder trabajar en Async, ya que no tengo idea de cuándo va a terminar cada tarea o incluso si va a terminar.

Respuesta

13

Cuando obtiene la propiedad Result, está efectivamente esperando que la tarea se complete. Se ejecutará en un hilo de fondo pero está esperando en su hilo principal la finalización antes de iniciar el siguiente hilo.

Consulte el MSDN doc para más detalles.

Usted debe ser capaz de simplemente asignar sus propiedades desde el subproceso de fondo:

Task<int>.Factory.StartNew(() => Number1 = GenerateResult()); 

enlace de datos WPF se take care of marshalling caso PropertyChanged al hilo despachador correcta.

+0

Muchas gracias Isak Savo funciona perfecto y es fácil de leer :-) Mucho más fácil que Backgroundworkers – gulbaek

+0

No es definitivo que cualquier tarea se ejecutará todo el tiempo en un hilo de trabajo. El resultado simplemente bloquea el hilo que lo llamó hasta que esté listo para dar salida a los datos o establecer una excepción. –

+0

Gracias, tenía una línea de depuración que llamaba .Result para poder hacer una prueba rápida y estaba rompiendo la sincronización: O – John

-4
Task<int>.Factory.StartNew(() => GenerateResult2()).ContinueWith(() => GenerateResult()); 
+5

A menos que me equivoque, esta es exactamente la misma semántica que el código del OP: la segunda tarea no se inicia hasta que la primera se haya completado. –

3

Comprobé esto: Task Parallelism (Task Parallel Library) y dice que al usar System.Threading.Tasks.Task<TResult> las tareas se ejecutan de forma asíncrona y pueden completarse en cualquier orden. Si se accede al resultado antes de que se complete el cálculo, la propiedad bloqueará el hilo hasta que el valor esté disponible.

Creo que eso significa que si tiene acceso a .Result antes de que tenga un valor, como lo está haciendo con el código de muestra, tendrá que esperar a que se complete primero.

Tiene sentido ya que la propiedad Result no se completará hasta que se complete la tarea.

+2

No vi la respuesta de Isak Savo que ya indica que el acceso a Result esperará a que se complete la tarea . – Nope

Cuestiones relacionadas