2012-06-01 1 views
19

Ecco un codice di esempio che crea una nuova attività che simula un processo in esecuzione prolungata. Non c'è molto sull'attività in quanto tale e si concentra esclusivamente sulle funzionalità di cancellazione. Uso il token di cancellazione per annullare l'attività e il codice funziona correttamente per me.Qual è l'uso del passaggio di CancellationToken al costruttore della classe Task?

 CancellationTokenSource CTS= new CancellationTokenSource(); 

     Task<Boolean> PTask = new Task<Boolean>(() => 
     { 
      while (true) 
      { 
       if (!CTS.Token.IsCancellationRequested) 
       { 
        Thread.Sleep(5000); 
       } 
       else{Console.WriteLine("Thread Cancelled");break;} 
      } 
      return true; 

     }, CTS.Token, TaskCreationOptions.None); 

     PTask.Start(); 
     Console.WriteLine("Hit Enter to cancel the Secondary thread you have started"); 
     Console.ReadLine(); 
     CTS.Cancel(); 
     System.Console.WriteLine(PTask.Result); 

    } 
} 

Ma onething che non ho potuto capire è il parametro token (CTS.Token) che viene trasmesso al Task Constructor.What è l'uso effettivo di passare il parametro, quando posso effettivamente annullare l'attività anche senza passare token al costruttore.

In basso è una versione leggermente modificata che funziona senza il parametro token.

 CancellationTokenSource CTS= new CancellationTokenSource(); 
     Task<Boolean> PTask = new Task<Boolean>(() => 
     { 
      while (true) 
      { 
       if (!CTS.Token.IsCancellationRequested) 
       { 
        Thread.Sleep(5000); 
       } 
       else 
       { 
        Console.WriteLine("Thread Cancelled"); 
        break; 
       } 
     }; 
+1

mi sento di raccomandare la lettura: http://blogs.msdn.com/b/pfxteam/archive/2009/05/22/9635790.aspx – Slugart

risposta

35

UPDATE: La seguente msdn domanda descrive il motivo:

passaggio di un gettone nella StartNew associa il token con l'operazione. Questo ha due vantaggi principali:

  1. Se il token ha cancellazione richiesto prima della Task partenza per l'esecuzione, il compito non sarà eseguire. Piuttosto che passare a Running, sarà immediatamente la transizione su Annullato. Ciò evita i costi di esecuzione dell'attività se si annullerebbe durante l'esecuzione.

  2. 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 OCE, si verifica se il token OCE corrisponde al token dell'attività. Se lo fa , tale eccezione viene vista come una conferma dell'annullamento cooperativo e l'operazione passa allo stato Annullato (piuttosto dello stato Faultato).

+0

Sta dicendo la iscancelrequest verificare con il token di primaria il thread non è sicuro. –

+0

Non riesco a vedere alcun altro motivo per passare il token al costruttore, ma se mi stai chiedendo se sono sicuro al 100%; bene no. – daryal

+0

L'ho aggiornato, infatti questo non ha nulla a che fare con la sicurezza dei thread. – daryal