Jaka jest różnica między Thraed.Abort() i Thread.Interrupt(). Jak mogę połączyć je w sposób bezpieczny dla wątków. Byłoby pomocne, gdyby podano prosty przykład.Różnica między przerwaniem i przerwaniem w wątkach w .NET
Odpowiedz
Po pierwsze, żadna z nich nie jest dobrym konstruktem synchronizacji wątków.
Po pierwsze, Thread.Abort mówi: "Nie obchodzi mnie, co robisz, po prostu przestań to robić i pozostaw wszystko w tej chwili". Jest to w zasadzie programowy sposób mówienia "Hej, pokonaj to". Jeśli twój wątek ma otwarte pliki, te pliki pozostaną otwarte, dopóki garbage collection nie przejdzie do finalizacji obiektów.
Thread.Abort powinien być zawsze używany, a nawet wtedy prawdopodobnie nie, w przypadku, gdy domena aplikacji, w której wątek działa wewnątrz, jest zrywane, najlepiej tylko wtedy, gdy proces jest kończony.
Po drugie, Thread.Interrupt to dość dziwna bestia. Zasadniczo mówi: "Nie obchodzi mnie, na co czekasz, przestań na to czekać". Dziwne jest to, że jeśli wątek nie czeka na nic, zamiast tego "nie obchodzi mnie, na co będziesz czekać na następny, ale kiedy to zrobisz, natychmiast przestań na to czekać".
Oba te znaki wskazują na to, że narzucasz swoją wolę na wątku, który nie został zaprojektowany do mówienia takich rzeczy.
Aby poprawnie przerwać wątek, wątek powinien okresowo sprawdzać flagę, czy jest to prosta zmienna zmienna typu Boolean, czy obiekt zdarzenia. Jeśli flaga mówi "Powinieneś teraz zakończyć", wątek powinien się zakończyć, powracając z metod w uporządkowany sposób.
Aby prawidłowo obudzić wątek, w miejscu, w którym musi czekać na obiekty synchronizacji, powinien znajdować się obiekt "proszę przestań czekać", na który również czeka. Tak więc w zasadzie dla obiektu, którego potrzebuje, zostaje zasygnalizowany, lub obiekt "proszę przestań czekać" zostaje zasygnalizowany, określić, który z nich zrobił, i zrobić to, co właściwe.
Więc zamiast Thread.Abort i Thread.Interrupt, należy napisać swoje wątki za pomocą zwykłych przedmiotów synchronizacji, jak wydarzenia, muteksy, semaforów itp
Z tego samego powodu, Thread.Suspend i Thread.Resume powinny być pozostawione w spokoju , a także zostały zastąpione w późniejszych wersjach .NET.
ile dzwonisz Abort
lub Interrupt
na wątku aktualnie wykonującego (jak ASP.NET nie do wypowiedzenia wniosek nagle, na przykład) w zasadzie nie można nazwać je w sposób bezpieczny wątku.
Użyj WaitHandle
lub Monitor.Wait
/Pulse
, aby czekać w trybie czuwania. Powinieneś przerwać tylko inne wątki, jeśli rozbijasz aplikację, w zasadzie - bo inaczej możesz skończyć w nieznanym stanie.
Zobacz przykład jak to zrobić ładnie.
Dobry artykuł Jon.By the Way, gdzie mogę znaleźć Twoją transmisję internetową? – user186973
@threadinglearner: jaki webcast masz na myśli? –
Wszystko o C# – user186973
Thread.Abort() podnosi wyjątek ThreadAbortException na docelowym wątku. Zasadniczo ma na celu wymuszenie zakończenia wątku. Nie jest zalecaną praktyką zatrzymywania przetwarzania wątku.
Thread.Interrupt() przerywa wątek będący w stanie WaitSleepJoin - zasadniczo blokuje zasób, taki jak WaitHandle. Pozwala to dzwoniącemu odblokować wątek.
Żadne z nich nie jest tak naprawdę "bezpieczne dla wątków" - w tym sensie, że mają one w zamierzeniu wpływać na zachowanie nici w sposób trudny do przewidzenia.
Ogólnie zaleca się używanie obiektów synchronizacji (takich jak WaitHandles lub Semafores), aby umożliwić bezpieczną synchronizację wątków.
Różnica między Przerwaniem a Przerwaniem polega na tym, że podczas gdy obydwaj rzucają wyjątek (wyjątek ThreadAbortException i ThreadInterruptException), wywołanie Abort spowoduje ponowne wyrzucenie wyjątku na końcu bloku catch i upewni się, że zakończysz bieżący wątek.
- 1. Zamykanie wszystkich wątków z przerwaniem klawiatury
- 2. Czy AUTO_INCREMENT może być bezpiecznie użyty przed PRZERWANIEM w MySQL
- 3. Jak zapobiec szybkiemu ruchowi myszy przed przerwaniem linii w mojej aplikacji do rysowania?
- 4. Jaka jest różnica między wykonywaniem ExecutorService i thread.run w uruchomionych wątkach jednocześnie w Javie?
- 5. .Net Installer - Różnica między .exe i .msi
- 6. Jaka jest różnica między C# i .NET?
- 7. Czy istnieje znacząca różnica między "Double" i "double" w .Net?
- 8. Jaka jest różnica między certyfikatami X509Certificate2 i X509Certyfikat w .NET?
- 9. Jaka jest różnica między KeyValuePair i Hashtable w .NET?
- 10. Jaka jest różnica między EnumerateFiles i EnumerateFileSystemEntries w .NET 4?
- 11. Różnica między sieci/http i net/http/fcgi w Golang
- 12. Jaka jest różnica między `.NET Core` i` .NET Core App`?
- 13. różnica między Netstat i ss w Linuksie?
- 14. Różnica między $ @ i $! w perl
- 15. Różnica między "i" w Lua
- 16. Różnica w SHA1 w .NET i MySQL
- 17. Różnica między System.DateTime.Now i System.DateTime.Today
- 18. Różnica między System.DateTime i System.DateTimeOffset
- 19. ucontext w wątkach
- 20. Propagowanie wyjątków w wątkach?
- 21. Obsługa wyjątków w wątkach
- 22. Różnica między IntPtr i UIntPtr
- 23. MySQL: Różnica między ",", "i"
- 24. Jaka jest różnica między C#, .NET i CLI?
- 25. Różnica między DatagramSocket i DatagramChannel
- 26. Composer.phar różnica między | i ||
- 27. Najlepszy sposób przekazywania obiektów między klasami w różnych wątkach?
- 28. Różnica między | = i^= css
- 29. Różnica między "% ~ dp0" i ". \"?
- 30. Różnica między ". +" I ". +?"
Czy możesz podać przykład tego, co próbujesz zrobić? Obecna forma twojego pytania ma sprzeczności. – Gary