2009-08-30 12 views
5

Używam wątków tła w interfejsie GUI. Obecnie wdrażam osobisty kod anulowania wątku, ale w wątkach jest właściwość IsBackground i zgodnie z MSDN one same się anulują.Czy mogę bezpiecznie polegać na IsBackground w wątkach, gdy aplikacja się zakończy?

Wiem, że to będzie Thread.Abort(), który jest nieprzyjemny, ale nic nie dzieje się w tym tle wątków, które muszę zachować w dobrym stanie lub wymaga odpowiedniego czyszczenia.

Próbuję uniknąć wszelkich awarii, jeśli użytkownik po prostu zamyka aplikację w środku wątku tła. Ponieważ scenariusze wielowątkowe są dość trudne do sprawdzenia, chciałbym poznać Twoją opinię na ten temat.

Zasadniczo, zamiast przewracać własny kod, wystarczy ustawić IsBackground = True i zapomnieć o reszcie?

Odpowiedz

4

Thread.Abort zgłasza wyjątek, więc jeśli twój kod jest już poprawnie napisany do użycia w końcu/w użyciu, powinien zakończyć się niepowodzeniem i zwolnić wszystkie zasoby.

edit

pewnie powinien dać trochę więcej szczegółów. Po pierwsze, wyjątek jest typu ThreadAbortException. Ciekawe jest to, że nawet jeśli go złapiecie i nic nie zrobicie, nie zniknie. Innymi słowy, jak tylko opuści swój blok catch, będzie dalej rzucany. Jest tak, że (zazwyczaj zła) praktyka złapania wyjątku i przełykania go nie zatrzymuje przerwania wątku. Jeśli rzeczywiście chcesz zatrzymać przerywanie, musisz uchwycić wyjątek, a następnie wywołać Thread.ResetAbort.

0

Myślę, że to zależy od zasobu. Na przykład gniazdo jest bezpiecznie zamykane po zakończeniu procesu. Dla niektórych zasobów lepiej wypuść je, zanim wyjdziesz z wątku.

5

MSDN page na stanach IsBackground własności:

Wątek jest albo wątek tła lub planie gwint. Tło Wątki są identyczne z wątkami pierwszego planu , z wyjątkiem tego, że wątki nie uniemożliwiają zakończenia procesu od . Gdy wszystkie wątki na pierwszym planie zostaną zakończone, , wspólny język programowania kończy proces. Dowolne istniejące wątki tła są zatrzymane i nie kończą się.

więc oznaczałoby to dla mnie, że trzeba by dokonać wątek dość obronną, aby zapewnić, że nie zostawił żadnych połączeń otwartych, bazy danych itd. Wszystko napisane pół krytyczny musiałyby być w planie wątku to uniemożliwiłoby zamknięcie aplikacji do czasu jej zakończenia.

5

Jonathan Greensted's post ma dobre podsumowanie o IsBackground:

Obiekt IsBackground pozwala powiedzieć runtime jeśli wątek jest pierwszoplanowy (UI) gwint lub tło wątek. Domyślnie wszystkie wątki są utworzone jako wątki pierwszoplanowe, chyba że zmienisz tę właściwość na .

Dlaczego więc się tym przejmujemy?

Cóż, runtime .NET robi coś specjalną kiedy ostatni planie wątek kończy - przerywa wszystkie tła gwintów i kończy aplikację . (Wiemy Thread.Abort jest złe jednak jeśli aplikacja jest jest zamknięcie i tak, że zło ma bardzo ograniczony czas trwania.)

Ujmując to w inny sposób, to praca wykonywana w tle wątku OK zatrzymać w dowolnym momencie, gdy aplikacja się zamknie?

Jeśli nie, to prawdopodobnie powinien to być wątek pierwszoplanowy - więc wątek pracujący z uchwytami plików lub otwierającymi połączenia z bazą danych powinien być na pierwszym planie, gdy aplikacja zakończy oczekiwanie na zakończenie tego wątku przed zakończeniem.

Powiązane problemy