he definido la siguiente tareaContinueWith una tarea cancelada
var t = Task.Factory.StartNew(
() => LongRunningMethod(cancellationToken),
cancellationToken
);
t.ContinueWith(
Callback,
cancellationToken,
TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext()
);
Dentro de la LongRunningMethod
, puedo comprobar si el elemento tiene una cancelación del pedido de cancelación, y si es así, volver a partir del método. Eso funciona bien.
Sin embargo, no se llama a la devolución de llamada en este escenario. La devolución de llamada hace se llama si se sustituye la segunda línea anterior con
t.ContinueWith(
x => Callback(x, cancellationToken),
TaskScheduler.FromCurrentSynchronizationContext()
);
En esta situación, la tarea todavía piensa que corrió hasta su finalización.
¿Por qué no funciona la primera llamada? Tenía la impresión de que TaskContinuationOptions.None
significa que se llamará a la devolución de llamada independientemente del estado del hilo.
Estoy cancelando la tarea llamando:
_cancellationTokenSource.Cancel();
En una nota algo relacionada, tener que pasar alrededor de fichas de cancelación se parece como un importante defecto de diseño de la biblioteca de tareas.
Entonces, ¿qué hace TaskContinuationOptions.None? Si digo TaskContinuationOptions.OnlyOnCancelled, tampoco funciona. – user981225
TaskContinuationOptions proporciona una forma de no ejecutar si se canceló la tarea * parent *. El parámetro CancellationToken es independiente. – usr