Domanda

Alcuni costruttori System.Threading.Tasks.Task prendere un CancellationToken come parametro:

CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);

Quello che mi sconcerta di questo è che non c'è modo di all'interno il corpo del metodo effettivamente arrivare al token passato a (ad esempio, niente come Task.CurrentTask.CancellationToken). Il token Deve essere fornita attraverso qualche altro meccanismo, ad esempio l'oggetto stato o catturato in un lambda.

Quindi, quale scopo non fornire la cancellazione gettone nel costruttore servire?

È stato utile?

Soluzione

Passando questo token nel costruttore associa compito con questo compito.

risposta di Stephen Toub da MSDN :

  

Questo ha due vantaggi principali:

     
      
  1. Se il token ha cancellazione richiesto prima della Task partenza per l'esecuzione, il task non sarà eseguito. Piuttosto che la transizione a   Running, sarà transizione immediatamente Canceled. Questo evita la   costi di gestione del compito, se sarebbe solo essere annullato durante l'esecuzione   in ogni caso.
  2.   
  3. Se il corpo del compito è anche monitorando la cancellazione token e genera un OperationCanceledException contenente quella pedina   (Che è quello che ThrowIfCancellationRequested fa), poi, quando il compito   vede che OperationCanceledException, controlla se le partite token di OperationCanceledException della Task   gettone. Se lo fa, tale eccezione è visto come un riconoscimento della   cancellazione cooperativa e le transizioni compito ai annullato   Stato (piuttosto che la stato di errore).
  4.   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top