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

Как выйти из всех запущенных потоков?

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

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

Ответ 1

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

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

Ответ 2

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

Environment.Exit(Environment.ExitCode);

Ответ 3

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

protected override void OnExiting(Object sender, EventArgs args)
{
    base.OnExiting(sender, args);
    Environment.Exit(Environment.ExitCode);
}

Ответ 4

Я прошел аналогичную проблему в своем программном обеспечении, но, к сожалению, просто заставляя потоки работать в фоновом режиме, это не решило проблему. Фактически, когда поток возвращает данные (основное программное обеспечение управляется данными), и если я закрою приложение, это приведет к ошибке 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);

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

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

Ответ 5

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

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

Application.Exit() 

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

Environment.Exit(Environment.ExitCode);