returns remarks method for comment code c# multithreading parallel-processing task-parallel-library conceptual

c# - remarks - ¿Por qué necesitamos el método ContinueWith?



returns c# (3)

¿Por qué necesitamos el método Task.ContinueWith() ? ¿No podemos simplemente escribir ese "código de continuación" dentro del cuerpo de la tarea?


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


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

Sin embargo, hay otra razón que puede aplicar. Granularidad

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

Si se encuentra en una situación en la que puede dividir una tarea en sub tareas TaskCreationOptions.LongRunning 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 hay 4 núcleos 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 desea un sistema escalable.

Si me preguntas, deberías usar ContinueWith () siempre que sea posible, ya que ayudará a la escala de tu aplicación.


Las continuaciones de tareas le permiten cadenas de tareas, a cada tarea de la cadena le sigue otra tarea

También en el método Task.ContinueWith puede verificar de forma asincrónica la Task con TaskContinuationOptions cuando la Task objetivo finaliza 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 mira here