it-swarm-ru.tech

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

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

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

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

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

Благодарю.

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

32
Night Walker

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

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

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

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

47
Cody Gray

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

13
R.Vector

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

4
tzup

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

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

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

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

4
Locke

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

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

Мои 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();
0
Academy of Programmer