2009-07-15 23 views
9

że ten kod:C# Zatrzymywanie nici po wyjątek

Thread t = new Thread(() => UpdateImage(origin)); 
t.Name = "UpdateImageThread"; 
t.Start(); 

Jeśli metoda UpdateImage (pochodzenie) wyjątek, jest konieczne przerwanie nici lub będzie zatykać po wyjątkiem?

Dziękujemy!

Odpowiedz

16

Jeśli zgłoszenie UpdateImage zgłasza wyjątek, prawdopodobnie spowoduje przerwanie całego procesu. Każdy wątek, który podnosi wyjątek najwyższego poziomu, wskazuje na duży problem. Powinieneś to zawinąć, na przykład wstawiając try/catch około UpdateImage i robiąc coś odpowiedniego. I tak, jeśli wyjątek dostaje się do górnej części wątku, wątek jest martwy:

Thread t = new Thread(() => { 
    try {UpdateImage(origin); } 
    catch (Exception ex) {Trace.WriteLine(ex);} 
}); 
t.Name = "UpdateImageThread"; 
t.Start(); 

(lub do wyboru z obsługi błędów)

1

Wątek zakończy się automatycznie, ponieważ nie obsługujesz wyjątku, wraz z resztą procesu, zakładając, że jesteś na .Net 2.0 lub nowszym (co zakładam, że jesteś spowodowany składnią C# 3 w pytaniu) .

3

Wyjątkiem nie spowoduje, że wątek się zatrzymać jeśli jest to złapany gdzieś w metodzie UpdateImage - chyba że klauzula catch jawnie wraca z metody.

Jeśli jest unhandeled, aplikacja będzie w każdym razie awarii - tym samym powodując Temat przestać;)

Najlepiej jest umieścić blok try ... catch w metodę UpdateImage i wykonać swój błąd logiczny magazynowe tam Gdzie należy. Następnie możesz zdecydować, czy pogoda ma powrócić i zakończyć wątek, lub spróbować ponownie

1

to jest jak główny wątek, na przykład, jeśli w wątku głównym wystąpił wyjątek i nikt go nie złapał, więc główny wątek " Przerwać i twój wniosek.

samo dla wątków użytkowników

10

Od .NET 2.0, gdy wątek tła zgłasza wyjątek (który nie jest obsługiwany), środowisko wykonawcze NET odbędzie swój proces. W aplikacji Windows.Forms jest inaczej; można użyć zdarzenia Application.ThreadException, aby wychwycić wyjątek.

To było inne w .NET 1.0/1.1, można przeczytać o całym temacie tutaj (np. Jak włączyć starsze zachowanie z .NET 2.0 lub nowszym): http://msdn.microsoft.com/en-us/library/ms228965.aspx#ChangeFromPreviousVersions.

Bez względu na to, czy używasz Windows.Forms, czy zachowania starszego typu - jeśli proces nie zakończy się, nie musisz jawnie zatrzymywać wątku; wyjątek go zatrzyma.