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?
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?
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.
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();
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
Nic nie ma nic wspólnego z WPF. Daj http://www.albahari.com/threading/ czytać, to byłby czas dobrze wydany! – Yahya