Подтвердить что ты не робот

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

У меня есть очень большая смесь приложений С# и j #.

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

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

Есть ли способ насильственно убить все потоки, которые были открыты приложением в закрывающем событии?...

Спасибо.

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

4b9b3361

Ответ 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

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

  1. Перешел по ссылке. Приложение Windows Form, поток не остановится
  2. Шаг первый не решил это. Environment.Exit(0); - решает и отлично работает.