2012-03-06 12 views
6

Używam C# .Net4.0 w VS 2010. Jak ponownie uruchomić Thread?Jak ponownie uruchomić wątek w C# .Net 4.0?

To jest jak chcę Abort() wątek i Start() to od początku jeszcze raz? Czy to możliwe?

+1

Ogólnie rzecz biorąc, "przerwanie()" wątku jest złym pomysłem. Jaki problem chcesz rozwiązać? – Heinzi

+0

To może pomóc: - [Ponowne wątku w C# 4.0] [1] [1]: http://stackoverflow.com/questions/1054889/restarting-a-thread-in-net- using-c – Misam

+0

Wymóg zatrzymania i uruchomienia wątku jest nieco nietypowy - jaki problem próbujesz rozwiązać? – dice

Odpowiedz

7

Utwórz nową instancję wątku i wykonaj ponownie. thread1 = new Thread(); thread1.start();

7

Przerwanie wątku jest często złym pomysłem. Jest doradcą. Jeśli jest to nieskończona pętla, boolean służy do zatrzymania wątku bez aborcji.

Aby zatrzymać wątek, ustaw wartość boolean na false i normalnie możesz ją później uruchomić.

+1

Dobra rada. 'run' powinno być' volatile', aby uniknąć nieokreślonego oczekiwania z powodu optymalizacji kompilatora. – Tudor

+1

Należy rozważyć użycie 'lock', essp szczególnie podczas ustawiania wartości boolowskiej. Nawet lepiej, używając go w połączeniu z 'monitorem'. Zajrzyj tutaj: http://stackoverflow.com/questions/1559293/c-sharp-monitor-wait-pulse-pulseall#1559662 –

+0

Moja funkcja wątku rozpoczyna się po kliknięciu, aby utworzyć serwer. Wykonuje pewną inicjalizację, a następnie przechodzi do nieskończonej pętli zawierającej socket.Accept().Kontrola utknęła na tym stwierdzeniu, więc nie mogę użyć tej metody blokowania. – Shashwat

2

Thread.Abort nie gwarantuje zakończenia wątku. Na przykład, jeśli masz długie zapytanie, przerwij nie przerwie wykonania kwerendy lub anulowania wątku. W rzeczywistości wątek będzie działać do momentu zakończenia kwerendy.

Jeśli robisz wszystko w zarządzanym kodzie i nie zostajesz zablokowany przez niezarządzane zasoby i musisz przerwać wątek, wątek.Abort() jest całkowicie w porządku.

Jednak nie można wywołać polecenia Start w wątku, który został zakończony. Będziesz musiał stworzyć kolejny wątek i zadzwonić Zacznij w tym wątku. Tworzenie wątków jest dość kosztowne, z pamięcią, w .NET (w porównaniu z innymi językami), więc istnieją pewne wady.

+0

Właściwie tworzenie wątku wciąż nie będzie zbyt drogie, ponieważ nie będzie wykonywane zbyt często. – Shashwat

1

Jeśli chcesz ponownie rozpocząć wątek od początku, faktycznie chcesz ponownie uruchomić wykonanie określonej funkcji (przepływu kodu) na wątku. Gdy utworzysz wątek i przekażesz funkcję do wykonania, żywotność wątku zostanie przerwana, gdy tylko funkcja zakończy swoje własne wykonanie. Trzeba tylko zmienić projekt kodu, który pozwoli na ponowne uruchomienie funkcji z odtworzeniem nowego wątku. Ale dla krótkich funkcji radzę użyć ThreadPool.

1

Od kiedy używasz .NET 4.0, gdzie MS wprowadziło "Wspólne Ramy Anulowania". Możesz przeczytać więcej z tego blog. Radzenie sobie bezpośrednio z wątkiem jest (coraz bardziej) odradzane.