Respuesta

9

A veces recibe una Tarea desde el exterior y quiere encadenar su continuación a ella. También hay formas de crear una tarea sin una Acción (por ejemplo, usando TaskCompletionSource).

5

continuaciones tarea que permiten a las cadenas de tareas, cada una en la cadena es seguido por una otra tarea

También en Task.ContinueWith método se puede comprobar de forma asíncrona el Task con TaskContinuationOptions cuando el objetivo Task se completa o se produce un error

Task task = Task.Factory.StartNew 
(
    () => 
     { 
      //Your action when the task started 
     } 
); 

task.ContinueWith 
(
    _ => 
     { 
      //Your action when the task completed 
     }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

task.ContinueWith 
(
    (t) => 
     { 
      //Action when error occured 
      Exception exception = null; 

      if (t.Exception.InnerException != null) 
      { 
      exception = t.Exception.InnerException; 
      } 
      else 
      { 
      exception = t.Exception; 
      } 

      //You can use this exception 
     }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

Para más información lee la respuesta de here

10

Sasha Goldshtein es correcta. Hay casos en los que su código de composición 'continuar' no tiene acceso directo o incluso establece el método de ejecución de una tarea. Un sistema conectable que quiere agregar taks, por ejemplo.

Sin embargo, hay otro motivo que puede aplicarse. Granularidad

Tenga en cuenta los requisitos que pueden provocar el uso de TaskCreationOptions.LongRunning. En un sistema paralelo donde se programan, ejecutan y completan cientos de procesos, el planificador de tareas está trabajando para promover la afinidad eficiente del procesador al programar tareas.

Si se encuentra en una situación en la que puede dividir una tarea en subtareas de grano fino y encadenarlas, ya no necesitará usar TaskCreationOptions.LongRunning. En términos simples, esto funcionará mejor porque es más fácil programar 100 tareas pequeñas para terminar al mismo tiempo, que programar 10 tareas grandes para hacer lo mismo en un entorno donde solo 4 núcleos están disponibles. Recuerde que no se garantiza que una tarea encadenada comience inmediatamente después de su antecedente.

Es una pregunta interesante y que solo se convierte en un problema cuando se desea un sistema escalable.

Si me preguntas, debes usar ContinueWith() siempre que sea posible, ya que ayudará a tu aplicación a escalar.

Cuestiones relacionadas