Utilizzo del token di cancellazione

Sto cercando di imparare come cancellare Task usando il token di cancellazione. Qui, ho scritto un UnitTest per questo, ma non sto ottenendo il modo in cui funziona.

[TestMethod] public async Task Task_should_not_run_when_token_cancelled_before_its_call() { var cts = new CancellationTokenSource(); var token = cts.Token; cts.Cancel(); Debug.WriteLine("Calling Cancellable Method".ToUpper()); try { await CheckMeCalled(token); } catch (Exception expException) { } } private async Task CheckMeCalled(CancellationToken ct) { Debug.WriteLine("Before task delayed".ToUpper()); await Task.Delay(5000); Debug.WriteLine("After task delayed".ToUpper()); } 

Nel test precedente ho chiamato cts.Cancel() prima di chiamare il metodo CheckMeCalled . quindi non dovrebbe funzionare come cancellato. Ma sta funzionando fino in fondo.

Ho letto da qualche parte che

If Task is not running and you cancel it then it will not go to a running state instead it go for canceled state when you call it .

Ma non sembra che stia succedendo qui. qualcuno può spiegarmelo? ogni aiuto è apprezzato. Saluti 🙂

La citazione che hai aggiunto era relativa alla creazione di una nuova Task tramite Task.Run o Task.Factory.Startnew . Quando si passa un metodo di CancellationToken al metodo, è necessario controllare triggersmente il token prima di eseguirlo

 private async Task CheckMeCalled(CancellationToken ct) { ct.ThrowIfCancellationRequested(); Debug.WriteLine("Before task delayed".ToUpper()); await Task.Delay(5000, ct); Debug.WriteLine("After task delayed".ToUpper()); } 

Ecco una citazione di Stephan Toub riguardante il token di cancellazione e l’ Task :

Se il token ha richiesto la cancellazione prima dell’avvio dell’attività, l’attività non verrà eseguita. Invece di passare a Running, passerà immediatamente a Canceled. Ciò evita i costi di esecuzione dell’attività se verrebbe annullato durante l’esecuzione.

Raccomando inoltre di leggere NET 4 Cancellation Framework per una revisione generale del meccanismo di cancellazione da parte del team PFX

Devi controllare manualmente il token per vedere se è stata richiesta una cancellazione.

Con:

 ct.IsCancellationRequested