2013-05-17 12 views
5

Mam aplikacji WPF, która ma BackgroundWorker. Zgłaszam wyjątek w tym BGW, ale nie jest on pokazywany gdzie !, tylko pracownik tła uruchamia swoje zdarzenie WorkerFinished.Dlaczego mój wyjątek nie robi żadnej różnicy w aplikacji wpf?

Gdzie idzie?

+1

Od wejścia MSDN na 'BackgroundWorker':„Jeśli operacja podnosi wyjątek, że kod nie obsługuje The BackgroundWorker łapie wyjątek i przekazuje go do Zdarzenie RunWorkerCompleted, gdzie jest ono ujawniane jako właściwość Error System.ComponentModel.RunWorkerCompletedEventArgs. " – dlev

+1

Nic nie ma nic wspólnego z WPF. Daj http://www.albahari.com/threading/ czytać, to byłby czas dobrze wydany! – Yahya

Odpowiedz

7

Każdy wątek ma własny stos wywołań; wyjątki mogą przesuwać tylko własne stosy wywołań, nie ma możliwości, aby "spadły" na stos wywołań innego wątku.

Gdy wyjątek bąbelki do kodzie BackgroundWorker, że pożary obsługi DoWork zdarzeń wyjątek będzie skończyć się jawnie złowionych i przechowywanych w nieruchomości Error zamiast pozwolić mu dotrzeć na szczyt stosu wywołań i awarii aplikacji.

Jeśli chcesz, aby program się zakończył, jeśli BGW zgłasza wyjątek, musisz zająć się zakończonym wydarzeniem, sprawdzić wyjątek, a następnie ponownie go wyrzuć lub wyrzuć nowy wyjątek.

+1

Wyjątek w wątku w tle spowoduje również awarię aplikacji, w tym przypadku klasa BackgroundWorker jest zaprojektowana tak, aby nie powodowała awarii aplikacji, jeśli zgłoszony zostanie wyjątek. – skjagini

+0

@ SujithJagini Right you are; edytowane. – Servy

4

Spójrz tutaj, jest ładny przykład. Wyjątkiem w throwned w RunWorkercompleted

Unhandled exceptions in BackgroundWorker

var worker = new BackgroundWorker(); 
worker.DoWork += (sender, e) => 
    { 
     throw new InvalidOperationException("oh shiznit!"); 
    }; 
worker.RunWorkerCompleted += (sender, e) => 
    { 
     if(e.Error != null) 
     { 
      MessageBox.Show("There was an error! " + e.Error.ToString()); 
     } 
    }; 
worker.RunWorkerAsync(); 
Powiązane problemy