2009-07-29 14 views
7

Mając złożoną sekwencję zadań, implementacja obsługi błędów może szybko zwiększyć kod przy użyciu bloków try/catch i takich jak odbiorniki wyboru na PortSet<ActualResult, Exception> dla każdego małego zadania.CCR: najlepsza praktyka w zakresie obsługi błędów przy użyciu przyczyn

Na szczęście CCR wydaje się oferować mechanizm obsługi wyjątków w bardziej ogólny sposób dla wykresu zadań: przyczyn. Typowym przykładem wygląda następująco:

Port<Exception> exceptionPort = new Port<Exception>(); 
Dispatcher.AddCausality(new Causality("some job", exceptionPort)); 
Arbiter.Activate(
    dispatcherQueue, 
    Arbiter.Receive(false, exceptionPort, ex => Console.WriteLine(ex))); 
// now schedule the real tasks 

W moim przypadku, mam obliczeniową intensywne aplikację korzystającą z CCR wdrożyć rozrzut/zbierać scenariusz, przecinania „Praca” w bandę zadań parallelized. (Poza tym więcej niż jedno z tych zadań może działać w tym samym czasie.) W przypadku niepowodzenia jednego zadania, chcę zatrzymać wszystkie pozostałe zadania w zadaniu, ale nie wykonywać żadnej innej pracy. (Wyniki są dla mnie bezużyteczne, jeśli brakuje mi kawałka układanki, więc kontynuowanie pracy nad tym byłoby tylko marnowaniem czasu procesora.)

Pytanie, jaki byłby najlepszy sposób zaimplementuj zatrzymanie.

Jednym z pomysłów byłoby:

  1. Stworzenie jednego Dispatcher instancji i utrzymać ją przez cały okres użytkowania aplikacji.
  2. Utwórz nową DispatcherQueue dla każdego "zadania" (grupy zadań). Dodaj Causality natychmiast po utworzeniu DispatcherQueue.
  3. W programie obsługi kolejki wyjątków wywołaj Suspend() na DispatcherQueue.
  4. Przed usunięciem kolejki wywoływania usuń przyczynę.

Zastanawiam się, czy ta sugestia może być uważana za najlepszą praktykę, czy też istnieje lepsze podejście do radzenia sobie z takim - prawdopodobnie dość powszechnym - scenariuszem.

Odpowiedz

1

Wygląda na to, że jest to dobry sposób, by mi o tym wszystkim powiedzieć.

Powiązane problemy