W witrynie MSDN opis metody Thread.Abort () mówi: „Wywołanie tej metody zwykle kończy wątek”.
Dlaczego nie ZAWSZE?
W jakich przypadkach nie kończy wątku?
Czy są jakieś inne możliwości zakończenia wątków?
c#
.net
multithreading
user101375
źródło
źródło
To pytanie jest powtórzone.
Co jest złego w używaniu Thread.Abort ()
Tak. Twoim problemem jest to, że nigdy nie powinieneś rozpoczynać wątku, którego nie możesz grzecznie przerwać, i kończy się on w odpowiednim czasie. Jeśli jesteś w sytuacji, w której musisz uruchomić wątek, który może być (1) trudny do zatrzymania, (2) błędny lub najgorszy (3) wrogi dla użytkownika, to właściwą rzeczą jest nowy proces, uruchom wątek w nowym procesie, a następnie zakończ proces, gdy chcesz, aby wątek został wyłączony. Jedyną rzeczą, która może zagwarantować bezpieczne zakończenie niewspółpracującego wątku, jest wstrzymanie całego procesu przez system operacyjny.
Zobacz moją zbyt długą odpowiedź na to pytanie, aby uzyskać więcej informacji:
Używanie instrukcji lock w pętli w C #
Istotnym fragmentem jest fragment na końcu, w którym omawiam rozważania dotyczące tego, jak długo należy czekać, aż wątek sam się zabije, zanim go przerwiesz.
źródło
Na początek wątek może przechwycić
ThreadAbortException
i anulować własne zakończenie. Lub może wykonać obliczenia, które trwają wiecznie, gdy próbujesz je przerwać. Z tego powodu środowisko wykonawcze nie może zagwarantować, że wątek zawsze zakończy się, gdy go o to poprosisz.ThreadAbortException
ma wiecej:Nie musisz
Abort()
ręcznie zakładać wątku. CLR wykona całą brudną robotę za Ciebie, jeśli po prostu pozwolisz metodzie w wątku powrócić; to zakończy wątek normalnie.źródło
FileStream.Read()
do nazwanego potoku, który aktualnie niczego nie odbiera (odczytuje bloki wywołań podczas oczekiwania na przychodzące dane) nie odpowiadaThread.Abort()
. Pozostaje wewnątrzRead()
rozmowy.źródło
Co się stanie, jeśli wątek zawiera blokadę i zostanie przerwany / zabity? Zasoby pozostają zablokowane
odniesienie MSDN
zobacz: Najlepsze praktyki w zarządzaniu wątkami
źródło
Nie mogę przerwać wątku, który utknął w pętli:
//immortal Thread th1 = new Thread(() => { while (true) {}});
Mogę jednak przerwać wątek, jeśli śpi podczas pętli:
//mortal Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});
źródło
ThreadAborts nie wystąpi wewnątrz bloku Final lub między BeginCriticalRegion i EndCriticalRegion
źródło
Ponieważ możesz złapać
ThreadAbortException
i wywołaćThread.ResetAbort
wewnątrz handlera.źródło
OT: Aby zapoznać się z obszernym, niezależnym od języka, wątpliwie użytecznym i cholernie zabawnym podejściem do współbieżności, zobacz Verity Stob !
źródło
Miałem przypadki, w których wątek był zbyt zajęty, aby usłyszeć wywołanie Abort (), co zwykle powoduje zgłoszenie wyjątku ThreadAbortingException do mojego kodu.
źródło