2012-06-01 19 views
19

Oto przykładowy kod, który tworzy nowe zadanie, które symuluje długotrwały proces. Nie ma w nim nic zbyt dużego i koncentruje się wyłącznie na funkcjach anulowania. Używam tokena anulowania, aby anulować zadanie, a kod działa poprawnie dla mnie.Do czego służy przekazanie Token Anulowania do konstruktora klasy zadań?

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

    } 
} 

Ale onething, że nie mogę zrozumieć, token parametru (CTS.Token), które jest przekazywane do Constructor.What zadaniem jest rzeczywiste wykorzystanie przekazując parametr, gdy faktycznie mogę anulować zadanie nawet bez podania tokena do konstruktora.

Poniżej znajduje się nieco zmodyfikowana wersja, która działa bez parametru tokenu.

 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

Polecam lekturę: http://blogs.msdn.com/b/pfxteam/archive/2009/05/22/9635790.aspx – Slugart

Odpowiedz

35

UPDATE: Poniżej msdn pytanie opisuje powód:

przechodzącą żeton do StartNew wiąże znacznik z zadań. Ma to dwie podstawowe zalety:

  1. Jeżeli żeton ma odwołania wymaganych przed rozpoczęciem wykonywania zadania, zadanie nie będzie wykonać. Zamiast przechodzić na Running, natychmiast przejdzie na Anulowane. Pozwala to uniknąć kosztów związanych z uruchomieniem zadania, jeśli zostanie ono anulowane po uruchomieniu.

  2. Jeśli ciało zadania jest również monitorowanie anulowanie token generuje OperationCanceledException zawierający ten żeton (czego ThrowIfCancellationRequested robi), a następnie, gdy zadanie widzi, że OCE, sprawdza czy Océ żeton dopasowuje token zadania. Jeśli jest to , wyjątek ten jest postrzegany jako potwierdzenie współpracy anulowania, a zadanie przechodzi do stanu Anulowane (raczej niż stan Awaria).

+0

Czy mówiąc iscancelrequest sprawdzić z tokena pierwotnego wątek jest niebezpieczny. –

+0

Nie widzę żadnego innego powodu przekazania tokena do konstruktora, ale jeśli pytasz, czy jestem w 100% pewny; dobrze nie. – daryal

+0

Zaktualizowałem, w rzeczywistości nie ma to nic wspólnego z bezpieczeństwem wątków. – daryal