2012-06-01 4 views
19

Hier ist ein Beispielcode, der eine neue Aufgabe erstellt, die einen langwierigen Prozess simuliert. Es gibt nichts viel auf die Aufgabe als solche und konzentriert sich nur auf die Aufhebung Funktionen. Ich benutze Abbruch-Token, um die Aufgabe abzubrechen und der Code funktioniert gut für mich.Was nutzt die Übergabe von CancellationToken an den Task Class-Konstruktor?

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

    } 
} 

Aber onething, die ich nicht verstehen kann, ist der Token-Parameter (CTS.Token), die auf den Task-Constructor.What geben wird die tatsächliche Nutzung des Leitens des Parameters ist, wenn ich die Aufgabe tatsächlich abbrechen auch ohne Token an den Konstruktor zu übergeben.

Unten ist eine leicht modifizierte Version, die ohne den Token-Parameter funktioniert.

 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

würde ich Lesung empfehlen: http://blogs.msdn.com/b/pfxteam/archive/2009/05/22/9635790.aspx – Slugart

Antwort

35

UPDATE: Die folgende msdn Frage beschreibt den Grund:

ein Token in StartNew Passing ordnet das Token mit der Aufgabe. Dies hat zwei wesentliche Vorteile:

  1. Wenn das Token Stornierung hat beantragt vor Ausführung der Aufgabe beginnt, wird die Aufgabe nicht auszuführen. Anstatt zu Running zu wechseln, wird sofort zu Cancelled übergehen. Dies vermeidet die Kosten für die Ausführung der Aufgabe, wenn es gerade während des Laufens abgebrochen würde.

  2. Wenn der Körper der Aufgabe auch die Streichung Token überwacht und wirft einen OperationCanceledException dass Token enthält (das, was ist ThrowIfCancellationRequested der Fall ist), dann, wenn sieht die Aufgabe, OCE, überprüft er, ob die Token des OCE entspricht dem Token der Aufgabe. Wenn es tut, wird diese Ausnahme als eine Bestätigung der kooperativen Stornierung angesehen und die Task wechselt in den Status Canceled (eher als der Status Faulted).

+0

Sagst du die von primären mit dem Token iscancelrequest überprüfen Thread ist unsicher. –

+0

Ich kann keinen anderen Grund sehen, Token an den Konstruktor zu übergeben, aber wenn Sie fragen, ob ich 100% sicher bin; gut nicht. – daryal

+0

Ich habe aktualisiert, in der Tat hat dies nichts mit Thread-Sicherheit zu tun. – daryal