Jak mogę się upewnić, że wszystkie wątki programu zostaną przerwane po zamknięciu głównego okna?Jak mogę wymusić zamknięcie wszystkich wątków programu po zamknięciu programu?
Odpowiedz
- Jeśli dobrze zaprojektowałeś gwintowanie, powinieneś mieć mechanizm, który je zamknie - np. używać
ManualResetEvent
je zasygnalizować, aby zamknąć - Można Thread.Join czekać aż do zamknięcia lub Thread.Abort aby je przerwać w paskudny sposób
- Jeśli są wątki tła, będą zamknąć, gdy aplikacja działa
Zobacz także: http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx
Dodam standardowy komentarz - nigdy nie używaj przerwania (szukaj tutaj na S/O, aby zobaczyć wszystkie szczegóły, dlaczego jest to bardzo zły pomysł). –
Czy czytaj dalej, dlaczego, ponieważ w większości przypadków jest to całkowicie dopuszczalny kompromis. "Nigdy nie używaj Przerwij" jest złe Obawiam się. –
Punkt targów. A może nie rób tego, chyba że rozumiesz argumenty przeciw i nie masz alternatywy. –
Zbierz je gdzieś, takich jak
static public List<Thread> AllThreads;
i wykorzystać tę kolekcję .Abort()
je, jeden po drugim.
To jest sposób HARDWRONG. Lepiej byłoby zasygnalizować im, by jakoś zaprzestali, a następnie jeden po drugim: .Join()
.
Masz na myśli '.Abort()'? '.Terminate' nie istnieje –
Również, jeśli masz listę, dlaczego nie' AllThreads.ForEach (t => t.Abort()); '? –
@KierenJohnstone kiedy powiedziałem, że kończą je jeden po drugim, dokładnie to miałem na myśli. Lambda, lub nie, kończysz je jeden po drugim. –
można ustawić "IsBackground" obiekt na true. Program CLR zamyka wszystkie wątki w tle po wyjściu aplikacji.
Pozwalając programowi faktycznie zamknąć, tj. nie celowo wprowadzaj żadnego kodu, który zmusza wątek, który uruchamia główne okno, do oczekiwania na inne wątki. Wątek, który uruchamia główne okno, będzie wtedy wolny do exitProcess(), a system operacyjny przerwie wszystkie pozostałe wątki w twoim procesie, bez względu na to, co robią.
Rgds, Martin
Domyślnie w .NET wątki, które nie są tłem, będą oznaczać, że aplikacja nie po prostu "zamknie". Jeśli wywołasz ExitProcess (który nazywa się Environment.Exit w świecie .NET), to zadziała –
Ups - błędne odczytanie znacznika "C#": ((Robi C++ w tej chwili .. –
Ustaw właściwość IsBackground
true, a następnie dodaj następujące linie:
AppDomain.CurrentDomain.ProcessExit += CloseMe; // for the main process
AppDomain.CurrentDomain.DomainUnload += CloseMe; // for ApplicationDomains
Niech metoda CloseMe
ustawić flagę, który jest sprawdzany w pętli głównej nitki.
Spróbuj
Application.ExitThread();
Environment.Exit(0);
lub
Dispatcher.CurrentDispatcher.Thread.Abort();
- 1. Jak śledzić otwarcie i zamknięcie programu NSWindow?
- 2. Jak wymusić hibernację, aby zwolnić pamięć po zamknięciu sesji?
- 3. Zapobieganie zamknięciu aplikacji po zamknięciu konsoli
- 4. Jak mogę uzyskać stan programu?
- 5. Wiadomości programu Logcat znikają po krótkim czasie.
- 6. Tworzenie programu ruby na wszystkich procesorach
- 7. Zmiana tapety z plikiem wsadowym przy zamknięciu programu. Możliwy?
- 8. Jak wymusić podział wiersza w tytule programu rmarkdown?
- 9. C# zabić wszystkich wątków
- 10. Jak wyświetlić listę połączeń wszystkich zarządzanych wątków za pomocą programu WinDBG?
- 11. Program końcowy po zamknięciu MessageBox
- 12. Jak wyjść z programu wsadowego po błędzie?
- 13. Powtórzenie wszystkich ścieżek programu Play w teście
- 14. Jak wymusić niepowodzenie kompilacji programu visual studio po niepowodzeniu testów jednostkowych
- 15. Jak używać programu Powershell do uruchamiania programu względem wszystkich plików w katalogu
- 16. Szybkie iterowanie po elementach umówionego programu Outlook
- 17. Jak wymusić śledzenie stosu dla wszystkich błędów krytycznych w Perlu?
- 18. wymuszenie programu wypłukiwania jego standardowego wyjścia po przekierowaniu
- 19. Po uruchomieniu programu w zasobniku systemowym
- 20. Czynność po zamknięciu formularza
- 21. Jak wykonać fragment kodu tylko po wykonaniu wszystkich wątków
- 22. Jak mogę zapobiec przeskakiwaniu kursora po zamknięciu nawiasów w Emacs?
- 23. Jak wymusić zamknięcie aplikacji na Androida i zrestartować ją?
- 24. Uruchamianie programu java z innego programu java
- 25. Jak mogę napisać ekran GNU, aby zacząć od uruchomionego w nim programu, aby nie opuszczał sesji po zakończeniu programu?
- 26. Jak uniemożliwić zamknięcie narzędzi programistycznych Chrome po zamknięciu bieżącego okna przeglądarki?
- 27. Uruchamianie agenta Java po uruchomieniu programu
- 28. Visual Studio 2010 wychodzące po zakończeniu programu
- 29. Jak mogę wyświetlić listę wszystkich wątków uruchomionych przez setTimeout/setInterval
- 30. Jak programowo importować dane programu Excel do tabeli programu Access?
Czy gwinty ustawiony jako wątków tła? –
WPF lub WinForms? – sll
@ LasseV.Karlsen: No – armin