2011-04-15 3 views
6

Esta es probablemente una pregunta bastante básica, pero es algo que quería asegurarme de tener en mente. Hoy estaba cavando con la biblioteca TPL y descubrí que hay dos formas de crear una instancia de la clase Tarea.Instancia de la clase Tarea (Task.Factory.StartNew o TaskCompletionSource)

manera I

Task<int> t1 = Task.Factory.StartNew(() => 
       { 
        //Some code 
        return 100; 

       }); 

Camino II

TaskCompletionSource<int> task = new TaskCompletionSource<int>(); 
    Task t2 = task.Task; 
    task.SetResult(100); 

Ahora, sólo quería saber que

  1. ¿Hay alguna diferencia entre estos casos?
  2. En caso afirmativo, ¿qué?

Respuesta

4

El segundo ejemplo no crea una tarea "real", es decir, no hay ningún delegado que haga algo.

Lo usa principalmente para presentar una interfaz de Tarea a la persona que llama. Mira el ejemplo de msdn

TaskCompletionSource<int> tcs1 = new TaskCompletionSource<int>(); 
    Task<int> t1 = tcs1.Task; 

    // Start a background task that will complete tcs1.Task 
    Task.Factory.StartNew(() => 
    { 
     Thread.Sleep(1000); 
     tcs1.SetResult(15); 
    }); 

    // The attempt to get the result of t1 blocks the current thread until the completion source gets signaled. 
    // It should be a wait of ~1000 ms. 
    Stopwatch sw = Stopwatch.StartNew(); 
    int result = t1.Result; 
    sw.Stop(); 

    Console.WriteLine("(ElapsedTime={0}): t1.Result={1} (expected 15) ", sw.ElapsedMilliseconds, result); 
+2

Para agregar un poco más de detalle, TaskCompletionSource es una forma de ajustar las operaciones asincrónicas que de otro modo no son compatibles actualmente con cosas como TaskFactory.FromAsync. Un ejemplo de uso de TaskCompletionSource es envolver las implementaciones de patrones asíncronos basados ​​en eventos como WebClient.DownloadStringAsync. Para obtener más ejemplos, consulte http://msdn.microsoft.com/en-us/magazine/ff959203.aspx –

0

Como no se está disparando cualquier operación asíncrona en Camino 1 anterior, se está perdiendo el tiempo por el consumo de otro hilo del subprocesos (posiblemente, si no se cambia el predeterminado TaskScheduler).

Sin embargo, en el Modo 2, está generando una tarea completada y lo hace en el mismo hilo que usted. TCS también se puede ver como una tarea sin hilos (probablemente la descripción incorrecta pero utilizada por varios desarrolladores).

+0

Task.StartNew es una operación asincrónica ... –

+0

@PeterRitchie ¿leyó lo que he escrito? Si va a ejecutar un código que no necesita un cambio de hilo pero necesita devolver un objeto Task, no está haciendo más que perder el tiempo utilizando 'Task.Factory.StartNew'. Deja de usarlo y usa TCS ya. – tugberk

+0

@PeterRitchie y 'Task.Factory.StartNew' no es una bala mágica y no es asincrónico. Puede llamarlo multiproceso pero no asincrónico. Asynchrony y multihilo es diferente. – tugberk

Cuestiones relacionadas