2012-01-03 17 views
11

Mam aplikację z przyciskami Start i Stop oraz wątek uruchomiony w tle po naciśnięciu Start. Używam do tego MVC i TPL.Obsługa wyjątków z TPL bez oczekiwania()

Jak mogę obsłużyć wyjątek w licencji TPL, ponieważ nigdy nie wywołuję metody Wait()? W każdym wyjątku muszę pokazać komunikat o błędzie, a to pole powinno być wyświetlane po tym, jak zostało ono od razu wysłane.

Mam zawsze pojedynczy wątek w tle, więc nie można nacisnąć Start bez uprzedniego zatrzymania wątku.

Szukam dobrych wzorów lub najlepszej praktyki. Mam pomysł, aby umieścić try..catch wewnątrz wątku i wywołać zdarzenie na każdym haczyku, ale nie jestem pewien, czy takie podejście jest dobrą decyzją o architekturze

Odpowiedz

24

Jeśli używasz Tasks, możesz dodać kontynuację, która działa tylko jeśli wyjątek został zgłoszony. Możesz również powiedzieć, aby działał w Twoim wątku UI, dzięki czemu będziesz mógł używać kontrolek interfejsu użytkownika:

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 
+0

To naprawdę fajna funkcja! Dzięki – Archeg

+0

@Archeg Nie ma za co. –

3

Na wysokim poziomie metoda Wait po prostu pobiera Exception, która wystąpił w wątku tła, opakowuje go w inny typ Exception i ponownie go rzuca. Możesz więc obserwować oryginalny numer Exception w wątku tła za pomocą standardowego bloku try/catch otaczającego twój kod logiczny.

2

Nie ma nic złego w obsłudze prawa wyjątku w Zadaniu (w wątku tła). Jeśli musisz pokazać interfejs użytkownika w przypadku wyjątku, możesz użyć modułu rozsyłającego (zakładając, że używasz wpf lub silverlight): http://msdn.microsoft.com/en-us/magazine/cc163328.aspx