2009-06-28 16 views

Odpowiedz

23

Ogólnie NIE pauzę (lub przerwać) A Thread - nie można normalnie powiedzieć, co robi, a to może prowadzić do różnego rodzaju problemów z blokowaniem, takich jak blokada, która nie została zwolniona, lub inicjalizator typów (konstruktor statyczny), który pozostaje zawieszony.

Można jednak wstrzymać kod poprzez bardziej eleganckich sposobów - na przykład za pomocą ManualResetEvent w pętli że kod zewnętrzny (w innym wątku) może otwierać i zamykać:

// worker loop 
while(alive) { 
    // if the gate is closed, wait up to 5 seconds; if still not 
    // open, go back to the loop-start to re-check "alive" 
    if (!gate.WaitOne(5000)) continue; 

    // do work... 
} 

wtedy inny wątek z dostępem (prawdopodobnie pośredni) może przerwać (Reset) i wznowić (Set) pracownika, ale wiedząc, że tylko zatrzymuje się w bezpiecznym stanie.


Powtórz swój komentarz (przy następnej odpowiedzi) - to brzmi jak masz czytelnika i pisarza; idealny dla scenariusza producent/konsument. Mam przykład on this question, jak napisać producenta/konsumenta z ograniczonym rozmiarem (więc nie będzie on zalewał, jeśli konsument będzie działał wolno) - konsument blokuje, jeśli nie ma danych, a producent blokuje, jeśli jest za dużo .

+1

+1 to absolutnie właściwe podejście. –

+1

Hej, to jest drugi +1, który musiałem wam dziś dać, aby podać jedną z moich mantr: nici powinny być odpowiedzialne za ich własne życia, w przeciwnym razie dostaniesz się do wszelkiego rodzaju problemów, takich jak zakleszczenia i utracone dane. Po tym, już nie zupa dla ciebie dzisiaj :-) – paxdiablo

+0

W porządku, jestem teraz ograniczona ;-p –

8

Po przerwaniu wątku nie będzie można ponownie uruchomić. Można uruchomić to samo zadanie (na przykład tego samego delegata ThreadStart) w innym wątku, ale to nie działa ponownie.

Chciałbym zdecydowanie doradzić, aby nie przerwać wątków, chyba że aplikacja jest w dół. Zamiast tego należy opracować protokół graceful thread termination, aby można było określić zadanie, które ma zostać zatrzymane. To samo dotyczy "wstrzymywania" wątku - naprawdę nie chcesz zawieszać wątku, gdy posiada on jakiś krytyczny zasób.

Może gdybyś mógł powiedzieć nam więcej o swojej sytuacji, możemy pomóc więcej. Pełne wstrzymanie/wznowienie lub anulowanie funkcji jest stosunkowo łatwe do osiągnięcia dzięki monitors (patrz druga połowa strony) lub wait handles.

+4

Niniejszym proponuję zakaz zarówno dla Jona Skeeta, jak i Marca Gravella ... nie wolno ci odpowiadać na skomplikowane pytania przez pierwsze 30 minut i na zawsze proste pytania: P –

+0

mój odczyt aplikacji z czytnika rfid przez contnuiasly wątek i zapisywanie danych identyfikacyjnych tagu w baza danych, pisząc dane na temat tej tagi chcę przerwać lub wstrzymać ten wątek i wznowić go oraz jak przerwać określony wątek plz pomóż mi w tym aspekcie –

1

Jeśli chcesz przez chwilę wstrzymać wątek, zadzwoń pod numer Sleep.

Jeśli chcesz zatrzymać, dopóki nie spełni się jakiegoś warunku, użyj zmiennej warunku lub oczekiwania.

Dla zmiennych warunkowych w metodach .NET należy stosować metody Monitor, w tym Wait i Pulse; see here do wprowadzenia. (W systemie Windows Vista dodano również obsługę zmiennych warunkowych dla interfejsu Win32 API, ale jest to całkowicie oddzielna implementacja, .NET ma zmienną obsługę zmiennych od wersji 1.0).

Dla Waitsa: to mrówka wykorzystanie WaitAny lub WaitAny metody przeciążeń klasy WaitHandle czekać na jednym z wielu typów obiektów Win32 synchronizacji eksponowanych w .NET jako podklas WaitHandle (wydarzenia, muteksy waitable timerów itd).

0

Jeśli chcesz to zrobić, mimo że jest to zły pomysł, spójrz na metody zawieszenia i wznowienia - MSDN ma more info na ten temat, w tym dlaczego jest to zły pomysł.

Powtarzam - zdecydowanie radzę wybrać rozwiązanie Marca Gravella.

+0

Drogi nowicjuszu, tu jest broń i kiedy jestem w tym możesz mieć kilka kul dummy, bądź naprawdę ostrożny, aby nigdy nie używać tego, co jest naprawdę niebezpieczne: P –

+0

Hej, jestem wielkim fanem mantry Heinlein'a "zbrojne społeczeństwo to grzeczna społeczność", więc tak, jeśli po tych wszystkich ostrzeżeniach on chce iść z zawieszeniem/wznowieniem ... przynajmniej odpowiedziałem na jego pytanie :) –

Powiązane problemy