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?
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?
Utwórz nową instancję wątku i wykonaj ponownie. thread1 = new Thread(); thread1.start();
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ć.
Dobra rada. 'run' powinno być' volatile', aby uniknąć nieokreślonego oczekiwania z powodu optymalizacji kompilatora. – Tudor
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 –
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
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.
Właściwie tworzenie wątku wciąż nie będzie zbyt drogie, ponieważ nie będzie wykonywane zbyt często. – Shashwat
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.
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.
Ogólnie rzecz biorąc, "przerwanie()" wątku jest złym pomysłem. Jaki problem chcesz rozwiązać? – Heinzi
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
Wymóg zatrzymania i uruchomienia wątku jest nieco nietypowy - jaki problem próbujesz rozwiązać? – dice