2012-08-09 9 views
6

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.

Respuesta

12

Su tarea de continuación toma un CancellationToken que cancela. Esto significa que la tarea de continuación, mientras está sin iniciar, se está cancelando. No pases esa ficha a una cosa que no quieras cancelar.

CancelaciónToken está destinado a cancelar todo el gráfico de acciones a la vez. Puede excluir cosas de la cancelación al no pasar el token.

+0

Entonces, ¿qué hace TaskContinuationOptions.None? Si digo TaskContinuationOptions.OnlyOnCancelled, tampoco funciona. – user981225

+1

TaskContinuationOptions proporciona una forma de no ejecutar si se canceló la tarea * parent *. El parámetro CancellationToken es independiente. – usr

Cuestiones relacionadas