2008-08-25 13 views

Odpowiedz

14

Nie trzeba ich usuwać. Kiedy twoja aplikacja się zakończy, .NET zabije wszystkie wątki z IsBackground = true. W wątku .NET wszystkie wątki są ustawione na wartość IsBackground = true, więc nie musisz się tym martwić.

Jeśli tworzysz wątki, tworząc nową klasę wątków, musisz albo je przerwać, albo ustawić właściwość IsBackground na wartość true.

2

Tak, będą. Jeśli jednak używasz niezarządzanych zasobów w tych wątkach, możesz skończyć z wieloma problemami.

3

W wątku używane są wątki w tle. W związku z tym wszystkie zostaną automatycznie zamknięte po wyjściu aplikacji.

Jeśli chcesz przerwać wątek samodzielnie, musisz samodzielnie zarządzać wątkiem (możesz wywołać Thread.Abort() na obiekcie wątku) lub będziesz musiał ustawić jakąś formę mechanizmu powiadamiania co pozwoli ci powiedzieć nici, że powinna się przerwać.

10

Jednakże, jeśli używasz niezarządzanymi zasobów w tych wątków, można skończyć się w kłopoty.

To raczej zależy jak się je za pomocą - jeśli te środki zostały właściwie niezarządzani owinięty wtedy oni być rozpatrywane przez ich owijarki finalizacji niezależnie od mechanizmu stosowanego do zabicia wątki który odwołuje je. Zasoby niezarządzane są zwalniane przez system operacyjny, gdy aplikacja i tak wychodzi.

Istnieje powszechne przekonanie, że aplikacje (Windows) spędzają dużo za dużo czasu próbując oczyścić górę na zamknięciu aplikacji - często z udziałem stronicowania w ogromnych ilości pamięci tak, że może być ponownie wyrzucić (lub paging- w kodzie, który biegnie dookoła zwalniając niezmienione obiekty, z którymi system operacyjny i tak by sobie poradził).

0

Tak, są tłem, ale f.ex jeśli masz aplikację, w której używasz ThreadPool do pewnego rodzaju wielokrotnego pobierania lub innych rzeczy, i chcesz je zatrzymać, jak się zatrzymać? moja propozycja będzie: wyjście gwint ASAP, f.ex

bool stop = false; 
void doDownloadWork(object s) 
{ 
    if (!stop) 
    { 
     DownloadLink((String)s, location); 
    } 
} 

a jeśli ustawić stop = prawdziwe, drugie (obecnie w kolejce) nici automatycznie zamknąć po nici kolejka kończy się proces.

+0

(noet Guenther's reply) –

0

Według odpowiedzi Lukas Šalkauskas.

Ale należy użyć:

volatile bool stop = false; 

aby poinformować kompilator zmienna ta jest używana przez kilka wątków.

+0

słowo kluczowe volatile ma dużo bardziej konkretne cele niż tylko zmienna używana przez wiele wątków. Są dobre czasy, aby go używać i złe czasy, chociaż użycie w tym scenariuszu wydaje się być odpowiednie. Nie chciałem, aby ktokolwiek przychodził, aby myśleć, że powinien to zrobić dla wszystkich zmiennych z wieloma wątkami.To tak, jakbyś powiedział, że nigdy nie powinieneś używać transakcji i zawsze podawać wskazówki nolock w SQL, kiedy to stwierdzenie bardzo zależy od danego rozwiązania. – TheXenocide

Powiązane problemy