2012-08-09 24 views
6

ho definito il seguente TaskContinueWith una task annullato

var t = Task.Factory.StartNew(
    () => LongRunningMethod(cancellationToken), 
    cancellationToken 
); 

t.ContinueWith(
    Callback, 
    cancellationToken, 
    TaskContinuationOptions.None, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

All'interno del LongRunningMethod, ho controllare se il token cancellazione ha una cancellazione richiesto, e se sì, io tornare dal metodo. Funziona molto bene.

Tuttavia, la richiamata non viene chiamata in questo scenario. Il callback fa ottenere chiamato se si sostituisce la seconda linea di cui sopra con

t.ContinueWith(
    x => Callback(x, cancellationToken), 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

In questa situazione, il compito pensa ancora si correva a compimento.

Perché la prima chiamata non funziona? Avevo l'impressione che TaskContinuationOptions.None significasse che il callback verrà chiamato indipendentemente dallo stato del thread.

Sono annullare la task chiamando:

_cancellationTokenSource.Cancel(); 

In una nota in qualche modo correlato, dovendo passare intorno gettoni cancellazione sembra un grave difetto di progettazione della libreria delle attività.

risposta

12

L'attività di proseguimento prende un Annullamento che si annulla. Ciò significa che l'attività di continuazione, mentre non avviata, viene annullata. Non passare quel token a qualcosa che non vuoi cancellare.

CancellationToken ha lo scopo di annullare l'intero grafico delle azioni contemporaneamente. Puoi escludere elementi dalla cancellazione non passando il token.

+0

Quindi cosa fa il taskContinuationOptions.None? Se dico TaskContinuationOptions.OnlyOnCancelled, anche questo non funziona. – user981225

+1

TaskContinuationOptions fornisce un modo per non eseguire se l'attività * parent * è stata annullata. Il parametro CancellationToken è indipendente. – usr

Problemi correlati