2015-02-11 19 views
5

Robię kilka operacji asynchronicznych i chciałbym użyć AnulujToken, aby zatrzymać uruchamianie zadania asynchronicznego, jeśli użytkownik na przykład zażąda tego. W tym celu dobrą praktyką jest posiadanie Słownika, dzięki któremu mogę znaleźć prawidłową Gwintę, aby zatrzymać prawidłową operację? Co Jestem obecnie patrząc na to:Przykład źródła Tokenka anulowania

public Dictionary<Thread, CancellationToken> CancellationTokenData; 

Zatem, jeżeli użytkownik zażąda unieważnienia na operację powinien zachowywać się poprawnie, jeśli się nie mylę?

Jakie są najlepsze praktyki, aby to zrobić?

Na przykład powiedz, że użytkownik wykonuje bardzo długą operację na zbiorze {A} wewnątrz bazy danych za pomocą wątku {B}. Następnie anuluje operację i wykonuje kolejną długą operację na zbiorze {A} z innego wątku. Czy należy używać zmiennej globalnej dla bieżącego CancellationToken?

+0

Nie mogę powiedzieć, że rozumiem, o co prosisz, ale anulowanie jest dość proste i nie ma absolutnie żadnego powodu, aby śledzić wątki. Tworzysz obiekt CancellationTokenSource i przekazujesz jego token do dowolnej długiej operacji, tj. Dowolnej metody akceptującej token anulowania. Klient wywołuje 'źródło' do przerwania, źródło sygnalizuje token, każda * operacja *, która monitoruje to kończy się z wdziękiem. Jest to operacja/metoda, która się kończy, a nie wątek. Nie ma tokena "bieżącego", możesz przekazać ten sam token do wielu operacji –

+0

@PanagiotisKanavos Ok, ale czy używasz zmiennej lokalnej, aby to zrobić? Jeśli używam lokalnego, mam zbyt ograniczone, że mogę go nazwać tylko w obecnej metodzie, a jeśli używam go jako zmiennej globalnej, rzeczy mogą stać się nieporządne? Czy powinienem mieć jeden globalny dla każdego? Mam nadzieję, że jesteśmy na tym samym torze. – Hristo

+0

Czy dobrze rozumiem, że istnieją zależności między wątkami? Oczywiście MUSISZ użyć tego samego tokena - a używanie słownika nie ma sensu ... –

Odpowiedz

15

Zwykle masz jedną CancellationTokenSource na operację, którą można anulować. Możesz przekazać AnulowanieTokenasource wszystkim, którzy mogą potrzebować anulować operację (cts.Cancel()) i jej CancellationToken (cts.Token) wszystkim, którzy muszą być świadomi odwołania.

Na tym poziomie abstrakcji nie zatrzymuje się nici; przestajesz działać. Wątki są jedynie szczegółami implementacji.

Dlatego nie uważam, że dobrym pomysłem jest odwzorowanie tokenów na wątki. Jeśli zadania są zaangażowane, jest to bardzo zły pomysł, ponieważ nie ma gwarancji, że każde zadanie faktycznie działa na nowym wątku.

+0

OK, więc jak zwykle odwzorowujesz kod anulujący na operację? – Hristo

+0

Powiedzmy na przykład, że chcę zatrzymać działanie A od wykonania i mam token anulowania z kolejnymi 10 odwołaniamiTokenów z innych operacji. Jakie jest właściwe podejście do łączenia operacji wykonującej token anulowania? – Hristo

+0

@ Chyba nie, właśnie o to chodzi. * Przekazujesz * to do metody jako parametru. Metody sprawdzają to np. Po każdym kroku pętli lub dodają procedurę obsługi zdarzeń do zdarzenia Anuluj, aby zrobić to, co chcą zrobić po anulowaniu. –

Powiązane problemy