2015-01-14 11 views
10

Mi chiedevo se c'è qualche differenza tra finire compito ciclo con CancellationTokenSource e uscire bandieraDifferenza tra CancellationTokenSource e bandiera di uscita per l'uscita del ciclo Task

CancellationTokenSource:

CancellationTokenSource cancellationTokenSource; 
Task loopTask; 

void StartLoop() 
{ 
    cancellationTokenSource = new CancellationTokenSource(); 
    loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); 
} 

void Loop() 
{ 
    while (true) 
    { 
     if (cancellationTokenSource.IsCancellationRequested) 
      break; 

     Thread.Yield(); 
    } 
} 

void StopLoop() 
{ 
    cancellationTokenSource.Cancel(); 

    loopTask = null; 
    cancellationTokenSource = null; 
} 

Exit bandiera:

volatile bool exitLoop; 
Task loopTask; 

void StartLoop() 
{ 
    exitLoop = false; 
    loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); 
} 

void Loop() 
{ 
    while (true) 
    { 
     if (exitLoop) 
      break; 

     Thread.Yield(); 
    } 
} 

void StopLoop() 
{ 
    exitLoop = true; 

    loopTask = null; 
} 

Per me non è possibile sance to use CancellationTokenSource, btw c'è qualche ragione per cui il token di cancellazione può essere aggiunto come parametro alla factory Task?

Grazie mille per qualsiasi tipo di risposta.

Vi ringrazio teamol

risposta

9
  1. Utilizzando un CancellationToken permette il token per gestire tutte la sincronizzazione necessaria, in modo da non devi pensarci.
  2. Quando un errore Task dovuto al token utilizzato nella sua creazione viene contrassegnato come annullato, imposta lo stato di Task su annullato, anziché su errore. Se si utilizza un booleano (e non si lancia), l'attività verrebbe contrassegnata come completata correttamente, anche se in realtà è stata annullata.
  3. A differenza di un booleano è un tipo di riferimento, quindi il riferimento al CTS può essere passato in giro e annullato (o verificato) da altre posizioni. Questo è fondamentale per il fatto che queste posizioni non devono essere accoppiate insieme come fareste se si usasse un campo booleano; né il codice che decide quando l'operazione viene annullata, né alcuno dei codici che reagiscono alla cancellazione, devono conoscersi l'un l'altro. Ciò consente una maggiore modularizzazione, astrazione, livelli superiori di funzionalità non specifici per le singole circostanze, ecc.
  4. Aggiunge un significato semantico migliorato al codice.
+0

Potresti fornirmi un esempio di utilizzo corretto di TaskCancelation? Quindi lo stato delle attività cambia dall'esecuzione? E come otterresti Token che è stato passato a startnew metodo? – Teamol

+0

@Teamol 'Run',' StartNew' e 'ContinueWith' hanno tutti i parametri per un token di cancellazione. Passa uno dentro. – Servy