Убивать все потоки, открытые приложением
У меня есть очень большая смесь приложений С# и j #.
Иногда, когда я закрываю его, есть некоторые потоки, которые не закрыты, и они висят в диспетчере задач, и от них невозможно их убить.
У меня действительно есть проблема, чтобы найти все эти потоки и добавить их в событие закрытия.
Есть ли способ насильственно убить все потоки, которые были открыты приложением в закрывающем событии?...
Спасибо.
Может быть, какой-то Инструмент, который может сказать мне, какие потоки открываются, когда я закрываю приложение и кто его открывал?
Ответы
Ответ 1
Это не должно происходить, и если это так, вы пытаетесь решить его неправильно.
Когда ваше приложение завершает работу,.NET Framework автоматически уничтожит любые потоки, для свойства IsBackground
установлено значение "True". Назначьте каждый из ваших рабочих потоков в качестве фоновых потоков, и у вас больше не будет этой проблемы. Воспользовавшись BackgroundWorker
class и ThreadPool
class, который автоматически создает фоновые потоки, намного лучше.
В противном случае вам необходимо явно очистить потоки переднего плана. Правильно разработанное приложение будет выполнять свою собственную бухгалтерскую отчетность и иметь детерминированный, структурированный способ обеспечения того, чтобы все его потоки были закрыты до выхода из метода Main
. Это то, что вы должны делать в любом случае, если ваши потоки требуют изящного завершения.
Убивание процесса - очень плохая идея, так как позволяет вашим потокам работать волей-неволей в вашем приложении.
Ответ 2
Вы можете использовать: Environment.Exit(0);, который отключит приложение, если потоки будут запущены и не вызовет никаких проблем.
Ответ 3
Ну, вы могли бы назвать Application.Exit()
, но это не поможет.
Суть в том, что вы должны изящно закрыть все потоки самостоятельно, если хотите сделать что-то правильно.
Ответ 4
Вы должны изящно закрыть свои потоки, но просто хотите, чтобы вы и другие знали, как это не рекомендуется, но возможно:
в обработчике OnClose:
System.Diagnostics.Process.GetCurrentProcess().Kill();
Я полностью предпочитаю Cody Gray делать это.
Ответ 5
Мои 2 цента... ко всем ответам...
Попробуйте заставить SHUTDOWN
Поместите в void CurrentApplication_Exit(object sender, ExitEventArgs e)
и private void Window_Closing(object sender, CancelEventArgs e)
те строки
System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
System.Windows.Application.Current.Shutdown();
Ответ 6
internal void Close()
{
Dispatcher.CurrentDispatcher.Thread.Abort();
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
Application.Current.Shutdown();
}
Ответ 7
У меня была похожая проблема при закрытии формы/заявления. Он не выходил из режима отладки и переходил в режим разработки. Следующее решает мою проблему.
- Перешел по ссылке. Приложение Windows Form, поток не остановится
- Шаг первый не решил это. Environment.Exit(0); - решает и отлично работает.