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à.
Quindi cosa fa il taskContinuationOptions.None? Se dico TaskContinuationOptions.OnlyOnCancelled, anche questo non funziona. – user981225
TaskContinuationOptions fornisce un modo per non eseguire se l'attività * parent * è stata annullata. Il parametro CancellationToken è indipendente. – usr