Как выйти из всех запущенных потоков? - PullRequest
53 голосов
/ 22 апреля 2010

Следующий код не выходит из приложения.Как выйти из приложения и убедиться, что все запущенные потоки закрыты?

foreach (Form form in Application.OpenForms)
{
    form.Close();
}
Application.Exit();

Ответы [ 6 ]

82 голосов
/ 22 апреля 2010

Вы не показываете использование каких-либо потоков в вашем коде, но давайте предположим, что у вас есть потоки в нем. Чтобы закрыть все ваши потоки, вы должны установить все из них в фоновые потоки, прежде чем запускать их, затем они будут закрыты автоматически при выходе из приложения, например ::

Thread myThread = new Thread(...);
myThread.IsBackground = true; // <-- Set your thread to background
myThread.Start(...);

Статья "HOWTO: остановка нескольких потоков" от Microsoft: http://msdn.microsoft.com/en-us/library/aa457093.aspx

50 голосов
/ 20 апреля 2013

Вы можете попробовать следующий код:

Environment.Exit(Environment.ExitCode);
23 голосов
/ 02 июня 2017

Я столкнулся с подобной проблемой в моем программном обеспечении, но, к сожалению, просто заставить потоки работать в фоновом режиме, не решить проблему. Фактически, хотя поток возвращает данные (основное программное обеспечение управляется данными), и если я закрываю приложение, это приводит к ошибке Windows, приводящей к сообщению отладки.

Так, что на самом деле работало для меня:

Шаг 1: Сделано, чтобы все потоки работали в фоновом режиме, например

Thread aThread = new Thread(MethodName);
aThread.IsBackground = true; //<-- Set the thread to work in background
aThread.Start();

Шаг 2: В действии закрытия формы / приложения вызовите метод Environment.Exit, например

Environment.Exit(Environment.ExitCode);

Это обеспечивало идеальное управление памятью без утечки памяти.

Надеюсь, это поможет.

13 голосов
/ 30 сентября 2013

Это должно работать для всех открытых вами тем.

protected override void OnExiting(Object sender, EventArgs args)
{
    base.OnExiting(sender, args);
    Environment.Exit(Environment.ExitCode);
}
3 голосов
/ 25 июля 2017

Это сделало работу за меня:

Вместо использования:

Application.Exit() 

, который оставляет другие темы открытыми, попробуйте использовать:

Environment.Exit(Environment.ExitCode);
2 голосов
/ 17 октября 2018

Это лучший способ убедиться, что ваше приложение закрывается (принудительно):

(Process.GetCurrentProcess()).Kill()

Проблема с Environment.Exit заключается в том, что оно не работает, если не включеноосновная нить.Кроме того, иногда он блокирует потоки.

Основная причина того, что ваша программа не закрывается должным образом, заключается в том, что форма не в состоянии утилизировать себя (и, следовательно, весь созданный ею объект).Исправить это гораздо сложнее.Я бы порекомендовал запустить приведенный выше код, подождав некоторое время, чтобы все возможные обработчики утилизации были вызваны первыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...