una tipo suculentas reproducen reproduccion que por plantas planta para otra menta hacer esquejes ejemplos cortar como cactus asexual arboles c# c#-4.0 .net-4.0 task-parallel-library

c# - tipo - Cómo propagar el estado cancelado de una tarea a una tarea de continuación



plantas que se reproducen por esquejes (1)

Creo que TaskCompletionSource es ideal para este escenario. Es decir, intenta devolver una Task como señal de finalización de su trabajo, pero controla manualmente cuándo y cómo informa esa tarea su estado. Podrías esconder fácilmente la placa de la caldera requerida para esto con un método de extensión como este:

public static Task<T> WithCleanup<T>(this Task<T> t, Action<Task<T>> cleanup) { var cleanupTask = t.ContinueWith(cleanup); var completion = new TaskCompletionSource<T>(); cleanupTask.ContinueWith(_ => { if(t.IsCanceled) { completion.SetCanceled(); } else if(t.IsFaulted) { completion.SetException(t.Exception); } else { completion.SetResult(t.Result); } }); return completion.Task; }

y llámalo así:

var doSomethingTask = Task.Factory .StartNew<object>(DoSomething, token) .WithCleanup(Cleanup);

La única advertencia real es que no se puede hacer esto con la Task antigua simple ya que no existe TaskCompletionSource no genérico.

Estoy usando la Biblioteca de tareas paralelas en mi aplicación. Tengo una Tarea (llamémosla "Hacer Algo") que puede ser cancelada. Ya sea que la tarea se haya fallado, cancelado o completado con éxito, tengo una continuación adjunta a esa tarea que realiza cierta limpieza.

En el código que inicia esta tarea, deseo devolver un objeto Task cuyo estado (fallado, cancelado, ejecutado hasta la finalización) refleja el estado de la tarea DoSomething, sin embargo, es importante que esta tarea que devuelvo no refleje este estado hasta la tarea de continuación ejecuta

Aquí hay un ejemplo:

public Task Start(CancellationToken token) { var doSomethingTask = Task.Factory.StartNew(DoSomething , token); var continuationTask = doSomethingTask.ContinueWith ( (antecedent) => { if (antecedent.IsFaulted || antecedent.IsCanceled) { //Do failure-specific cleanup } //Do general cleanup without regard to failure or success } ); //TODO: How do I return a Task obj which Status reflect the status of doSomethingTask, //but will not transition to that status until continuationTask completes? }

Podría usar TaskCompletionSource, pero parece kludgy. ¿Alguna otra idea?