¿Por qué necesitamos el método Task.ContinueWith()
? ¿No podemos simplemente escribir ese "código de continuación" dentro del cuerpo de la tarea?¿Por qué necesitamos el método ContinueWith?
Respuesta
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).
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
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.
- 1. ¿Por qué necesitamos Thread.MemoryBarrier()?
- 2. ¿Por qué necesitamos fibras
- 3. ¿Por qué incluso necesitamos el operador "delete []"?
- 4. ¿Por qué necesitamos web-sockets?
- 5. ¿Por qué necesitamos ng-click?
- 6. ¿Por qué necesitamos C Unions?
- 7. ¿Por qué necesitamos mesa virtual?
- 8. ¿Por qué necesitamos usar Radix?
- 9. ¿Por qué necesitamos marcos burlones?
- 10. ¿Por qué necesitamos struct? (C#)
- 11. ¿Por qué aparece una advertencia del compilador cuando uso ContinueWith?
- 12. ¿Por qué necesitamos delegados de C#
- 13. ¿Por qué necesitamos un constructor privado?
- 14. ¿por qué necesitamos zone_highmem en x86?
- 15. ¿Por qué necesitamos interfaces en Java?
- 16. ¿Por qué necesitamos Application Server en Java?
- 17. ¿por qué necesitamos ClassMethods e InstanceMethods?
- 18. ¿Por qué necesitamos funcall en Lisp?
- 19. ¿Por qué necesitamos una etiqueta fieldset?
- 20. ¿Necesitamos el método getClass() de java.lang.Object?
- 21. ¿Por qué necesitamos servicios web RESTful?
- 22. ¿Por qué necesitamos Propiedades en C#
- 23. ContinueWith una tarea cancelada
- 24. ¿Por qué necesitamos este operador especial ===?
- 25. ¿Por qué todavía necesitamos código generado?
- 26. ¿Por qué necesitamos parámetros de "salida"?
- 27. ¿Por qué necesitamos patrones de diseño?
- 28. ¿Por qué necesitamos la interfaz IEqualityComparer, IEqualityComparer <T>?
- 29. Marshalling: ¿qué es y por qué lo necesitamos?
- 30. ¿Qué es __i686.get_pc_thunk.bx? ¿Por qué necesitamos esta llamada?