2012-02-27 14 views
13

Mam długotrwałe zadanie, które zaimplementowałem przy użyciu zadania równoległego biblioteki. Po uruchomieniu zadania pobieram migawki z kilku wartości wejściowych i kolekcji, a następnie wykonuję różne operacje przy użyciu tych informacji. Jeśli dowolna z tych wartości lub kolekcji ulegnie zmianie podczas wykonywania zadania, chciałbym, aby zadanie zostało uruchomione ponownie natychmiast po zakończeniu. Czy powinienem tworzyć nowe zadanie, czy też istnieje sposób ponownego wykorzystania istniejącego zadania? Jaki jest najlepszy sposób na rozpoczęcie drugiej iteracji?Jak zrestartować/ponownie użyć zadania cyklicznego?

Odpowiedz

11

Utwórz nowe zadanie.

Jak wskazuje http://msdn.microsoft.com/en-us/library/dd270682.aspx, próba ponownego uruchomienia uruchomionego lub zakończonego zadania nie jest obsługiwana. Rzadko jest dobrze zrobić coś, co normalnie zgłasza wyjątek, a ponowne użycie zadania jest jedną z tych rzeczy.

+0

Jak sygnalizowałbyś potrzebę wykonania drugiego zadania? Zmiany mogą wystąpić, gdy oryginalne zadanie zostanie uruchomione, aż do momentu zakończenia jego działania. – SonOfPirate

+0

Bazując na tych kryteriach, myślę, że zrobiłbyś dobrze z jednym, nie kończącym się Zadaniem, które wypytuje bieżący stan, a jeśli stan się zmieni, zrób to. Podstawowym wymaganiem jest tutaj to, że dzieje się to asynchronicznie, aby uniknąć zablokowania głównego wątku. Będziesz musiał umieścić flagę jakiegoś rodzaju, aby wskazać Zadanie, że aplikacja się zamyka i powinna się zakończyć. –

+0

Jedno, nie kończące się zadanie jest tym, o czym myślałem. Mogę użyć Token Anulowania do obsługi, gdy aplikacja się zamyka, ale nie jestem pewien, jaki mechanizm powinienem użyć, aby oznaczyć, że potrzebuję Zadań do wykonania moich algorytmów. Jeśli użyję AutoResetEvent, nie będę mógł anulować, ponieważ wątek Zadań zostanie zawieszony w oczekiwaniu na wydarzenie. Z drugiej strony, czytam, że używanie SpinWait wymaga dużej mocy obliczeniowej. – SonOfPirate

1

Nie można ponownie uruchomić istniejącego Task. Masz więc dwie możliwości:

  1. Rozpocznij nową Task. To jest prawdopodobnie czystsze.
  2. Uruchom pętlę w swoim Task, która sprawdza, czy coś się zmieniło od ostatniego czasu, a jeśli tak, rozpocznie nową iterację.
+0

To samo pytanie co powyżej: Jak zasygnalizowałbyś potrzebę drugiego zadania? – SonOfPirate

+0

Trudno powiedzieć, nie wiedząc, jak określić, że drugie zadanie jest potrzebne. Jeśli chcesz uruchomić ponownie, nawet po jego zakończeniu, możesz użyć zdarzeń. – svick

0

Można również zmodyfikować logikę programu, aby użyć wskaźników funkcji (lub delegatów w VB.NET).

Powiązane problemy