2015-06-16 24 views
10

Uruchamiam zadanie, które rozpoczyna inne zadania i tak dalej.
Biorąc pod uwagę, że drzewo, jeśli jakieś zadanie nie powiedzie się, wynik całej operacji jest bezużyteczny. Rozważam użycie tokenów anulowania. Ku mojemu zaskoczeniu, token nie ma „CancelThisToken()” metoda ...Jak anulować anulowanieToken

Więc moje pytanie brzmi: w jaki sposób mogę w posiadaniu TYLKOCancellationToken, anulować?

+0

Poszukujesz CancellationTokenSource https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource(vsv.110).aspx – CoderDennis

+0

@CoderDennis Nie widzę, jak mogę uzyskać źródło tokenu podane tylko token ... – Leonardo

+1

Jeśli nie masz 'CancellationTokenSource', to nie możesz go anulować. Token jest obiektem, który dzielą wszystkie wątki, ten obiekt jest ustawiany za pomocą metody 'CancellationTokenSource.Cancel()'. Gdy to zrobisz, "CancellationToken.IsCancellationRequested" będzie prawdą. Do tego czasu zawsze będzie fałszem. (Nie można go ustawić bezpośrednio.) Jeśli nie masz 'CancellationTokenSource', to nic nie jest w stanie rzucić anulowania. Ty ** potrzebujesz ** a 'CancellationTokenSource', aby anulować takie wątki. –

Odpowiedz

24

Jako stan dokumentacji należy wywołać metodę anulowania z obiektu źródłowego. Przykładowy kod znajduje się w podanym przez Ciebie linku. Oto odpowiednie sekcje:

// Define the cancellation token. 
CancellationTokenSource source = new CancellationTokenSource(); 
previouslyProvidedToken = source.Token; 
... 
source.Cancel(); 

https://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken(v=vs.110).aspx

jak mogę, w posiadaniu tylko CancellationToken, anulować?

Bez odniesienia do źródła nie można anulować tokena. Nie oznacza to, że potrzebujesz źródła CancellationTokenSource, które po raz pierwszy zainicjowało token. Po podaniu Tokenu można utworzyć nową instancję źródła tokenu, przydzielając token do dostarczonego tokena i anulować go. Wszystkie inne podmioty, które mogą odczytać token, zobaczą, że żądanie anulowania zostało wysłane.

+0

Nie widzę, jak mogę uzyskać token źródło podając tylko token ... – Leonardo

+1

@ Leonardo, należy najpierw utworzyć tokensource, a następnie zażądać tokena z niego. Spójrz na przykładowy kod w podanym przeze mnie linku – RyanS

+1

To jest metoda, której używam do naszego narzędzia do tworzenia kopii zapasowych w pracy - jeśli jakikolwiek "Zadanie" zawodzi, moje wyniki również są bezużyteczne.(Dwie bazy danych, jedna baza danych SQL, jedna baza danych DB2 AS/400 są niezsynchronizowane i jest to niedopuszczalne.Więc odrzucam wszystkie dane, jeśli coś się nie powiedzie.) –

0

Spawn CancellationToken instancji z instancji CancellationTokenSource i wywołanie Anuluj w instancji CTS.

Przykład: https://msdn.microsoft.com/en-us/library/dd321955(v=vs.110).aspx

Jest też sposobem wdzięcznie anulować wątki bez ich wypalanie wyjątki, wystarczy sprawdzić CT dla IsCancellationRequested i obsłużyć sprawę samodzielnie. Więcej informacji: Use of IsCancellationRequested property?

+1

Nie widzę, w jaki sposób mogę uzyskać token źródło, biorąc pod uwagę tylko token ... – Leonardo

+0

Następnie, gdy jesteś pod warunkiem, masz kontrolę nad anulowaniem. Możesz albo zachować zakładki IsCancellationRequested, albo polegać na tym, że framework rzuca wyjątek na twój wątek, aby to zrobić. – Machinarius

3

Jako rozszerzenie odpowiedzi udzielonych do tej pory, jeśli chcesz mieć zarówno instancją CancellationToken warunkiem do swoich metod, i anulować wewnętrznie, należy zbadać CancellationTokenSource.CreateLinkedTokenSource. W istocie anuluje to, gdy zostanie wywołane cts.Cancel() lub jeden z dostarczonych tokenów.