2015-01-14 6 views
10

ich mich gefragt, ob es einen Unterschied zwischen endende Schleife Aufgabe mit CancellationTokenSource und VerlassensflagUnterschied zwischen CancellationTokenSource und Verlassensflag für Task-Loop-Ausgang

CancellationTokenSource ist:

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; 
} 

Verlassensflag:

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; 
} 

Zu mir macht es keine Sance, um CancellationTokenSource zu verwenden, gibt es irgendeinen Grund, warum Abbruch-Token als Parameter zu Task Factory hinzugefügt werden kann?

Vielen Dank für jede Art von Antwort.

Beste ragards teamol

Antwort

9
  1. ein CancellationToken Mit dem Token ermöglicht alle notwendigen Synchronisation zu handhaben, so dass man über sie müssen nicht denken.
  2. Wenn ein Task Fehler aufgrund des Tokens, das bei seiner Erstellung verwendet wurde, als abgebrochen markiert wird, wird der Status Task auf abgebrochen gesetzt, anstatt fehlerhaft. Wenn Sie einen booleschen Wert verwenden (und nicht werfen), wird die Aufgabe tatsächlich als erfolgreich abgeschlossen markiert, obwohl sie tatsächlich abgebrochen wurde.
  3. Im Gegensatz zu einem Booleschen Wert handelt es sich um einen Referenztyp, so dass der Verweis auf den CTS von anderen Orten aus weitergegeben und abgebrochen (oder inspiziert) werden kann. Dies ist der Schlüssel dafür, dass diese Stellen nicht so miteinander verbunden werden müssen, wie dies bei Verwendung eines booleschen Feldes der Fall wäre. weder der Code, der entscheidet, wann die Operation abgebrochen wird, noch der Code, der auf die Löschung reagiert, muss sich gegenseitig kennen. Dies ermöglicht eine größere Modularisierung, Abstraktion, höhere Funktionalitätsebenen, die nicht spezifisch für individuelle Umstände sind, etc.
  4. Es fügt dem Code eine verbesserte semantische Bedeutung hinzu.
+0

Können Sie mir bitte ein Beispiel für die korrekte Verwendung von TaskCancelation geben? Also ändert sich der Status des Tasks vom Laufen? Und wie würdest du Token bekommen, die zu einer neuen Methode weitergegeben wurde? – Teamol

+0

@Teamol 'Run',' StartNew' und 'ContinueWith' haben alle Parameter für ein Abbruch-Token. Pass eins rein. – Servy

Verwandte Themen