Как я могу гарантировать, что все потоки программы прекратятся после закрытия главного окна?
Как заставить все потоки программ выходить из программы при закрытии программы?
Ответ 1
- Если вы хорошо спроектировали поток, у вас должен быть механизм для их закрытия - например, используйте
ManualResetEvent
, чтобы сигнализировать им о закрытии - Вы можете Thread.Join подождать, пока они закрываются, или Thread.Abort, чтобы они отменили неприятный путь.
- Если они являются фоновыми потоками, они закрываются, когда приложение выполняет
Смотрите также: http://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx
Ответ 2
Вы можете установить для свойства IsBackground значение true. CLR закрывает все фоновые потоки, когда приложение завершает работу.
Ответ 3
Попробуйте
Application.ExitThread();
Environment.Exit(0);
или
Dispatcher.CurrentDispatcher.Thread.Abort();
Ответ 4
Соберите их где-нибудь, например
static public List<Thread> AllThreads;
и используйте эту коллекцию для .Abort()
, один за другим.
Это ТРУДНО И НЕПРАВИЛЬНО. Лучше было бы сигнализировать им как-то остановиться, а затем .Join()
один за другим.
Ответ 5
Задайте для свойства IsBackground
значение true и добавьте следующие строки:
AppDomain.CurrentDomain.ProcessExit += CloseMe; // for the main process
AppDomain.CurrentDomain.DomainUnload += CloseMe; // for ApplicationDomains
Пусть метод CloseMe
устанавливает флаг, который проверяется в основном контуре потока.
Ответ 6
Позволяя программе фактически закрыть, т.е. не намеренно вводить любой код, который заставляет поток, который запускает основное окно, ждать каких-либо других потоков. Затем поток, который запускает основное окно, будет свободен для выхода из процессаProcess(), и тогда ОС прекратит все остальные потоки вашего процесса, независимо от того, что они делают.
Rgds, Мартин