Убить все темы, открытые приложением

У меня есть действительно большая смесь приложений из C# и j#.

Иногда, когда я закрываю его, появляются некоторые потоки, которые не закрываются, и они висят в диспетчере задач, и их невозможно убить оттуда.

У меня действительно проблема, чтобы найти все эти темы и добавить их в закрытие события.

Есть ли какой-нибудь способ насильственно уничтожить все потоки, которые были открыты приложением в событии закрытия?...

Благодарю.

Может быть, есть какой-нибудь инструмент, который может сказать мне, какие потоки открыты, когда я закрываю приложение, и кто их открыл?

6 ответов

Решение

Этого не должно быть, и если это так, вы пытаетесь решить это неправильно.

При выходе из приложения.NET Framework автоматически уничтожает все потоки, чьи IsBackground свойство имеет значение "True". Обозначьте каждый из ваших рабочих потоков как фоновые потоки, и у вас больше не будет этой проблемы. Воспользовавшись BackgroundWorker класс и ThreadPool Класс, который автоматически создает фоновые потоки, является гораздо лучшим вариантом.

В противном случае вам необходимо явно очистить потоки переднего плана. Правильно спроектированное приложение будет вести свою собственную бухгалтерию и будет иметь детерминированный, структурированный способ гарантировать, что все его потоки были закрыты до выхода из Main метод. Это то, что вы должны делать в любом случае, если ваши потоки требуют изящного завершения.

Убивать процесс - очень плохая идея, так как позволить вашим потокам волнообразно работать в вашем приложении.

Вы можете использовать: Environment.Exit(0);, это закроет приложение, если потоки работают и не вызовет каких-либо проблем.

Вы должны закрыть свои темы изящно, но просто хотите, чтобы вы и другие знали способ, который не рекомендуется, но возможен:

в вашем обработчике OnClose:

System.Diagnostics.Process.GetCurrentProcess().Kill();

Я полностью предпочитаю Коди Грей способ сделать это.

Ну, вы могли бы позвонить Application.Exit() но это не сильно поможет. Суть в том, что вы должны изящно закрыть все потоки самостоятельно, если вы хотите сделать все правильно.

Мои 2 цента... на все ответы...

Попробуйте принудительно отключить

Положить в 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();

У меня была похожая проблема при закрытии формы / заявления. Он не выходил из режима отладки и переходил в режим разработки. Следующее решает мою проблему.

  1. Перешел по ссылке. Приложение Windows Form, поток не остановится
  2. Шаг первый не решил это. Environment.Exit(0); - решает и отлично работает.
internal void Close()
{
    Dispatcher.CurrentDispatcher.Thread.Abort();
    Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
    Application.Current.Shutdown();
}
Другие вопросы по тегам