Убивает ли Application.Exit() фоновые потоки?

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


person Mohamed    schedule 25.04.2012    source источник
comment
stackoverflow.com/questions/3689564/   -  person zimdanen    schedule 26.04.2012
comment
Вы хотите убить фоновые потоки или нет?   -  person Servy    schedule 26.04.2012
comment
Кроме того, почему вы спрашиваете нас? Почему бы просто не запустить его и не убедиться в этом самим.   -  person Servy    schedule 26.04.2012
comment
@Servy, почему бы тебе не сказать ему, где наблюдать за запущенными фоновыми потоками?   -  person eran otzap    schedule 26.04.2012
comment
Ему не нужно знать, есть ли запущенные фоновые потоки, ему нужно знать, запущен процесс или нет. Диспетчер задач может сообщить вам об этом, или, если вы отлаживаете в VS, IDE будет находиться в режиме отладки, пока процесс не завершится. Если он исчезнет, ​​потоки будут завершены или убиты. Если это не так, есть потоки переднего плана, поддерживающие процесс открытым.   -  person Servy    schedule 26.04.2012
comment
@Servy, извините, я новичок в C # и просто просил убедиться, что у меня не будет запущенных потоков после того, как мое приложение существует. Вы могли бы поставить свой последний комментарий первым вместо того, почему вы спрашиваете нас   -  person Mohamed    schedule 26.04.2012
comment
А Зимданен спасибо за ссылку.   -  person Mohamed    schedule 26.04.2012
comment
Ваш пост, похоже, не подразумевает, что вы не можете определить, запущены ли фоновые потоки. Если бы это было частью вопроса или если бы вы спросили, я бы сказал вам, как проверить. Я также спросил, почему вы просто не запустили его, потому что ответы, которые вы дали, были неправильными, и я знаю, что другие отвечающие могут провести простой тест, чтобы узнать ответ.   -  person Servy    schedule 26.04.2012
comment
Также обратите внимание, что ссылка в основном говорит о процессах, а не о потоках, которые очень разные. Убедитесь, что вы не перепутали их.   -  person Servy    schedule 26.04.2012
comment
Servy Я знаю, что фоновые потоки работают. Я хотел знать, выйду ли я из приложения до завершения фонового потока, продолжится ли фоновый поток или он завершится. В любом случае, спасибо, Серви, у меня просто был плохой и долгий день на работе. Теперь, чтобы быть в безопасности, могу ли я сказать, что разница между процессом и потоком заключается в том, что процесс выполняется в своем собственном пространстве памяти, а потоки выполняются в пространстве общей памяти.   -  person Mohamed    schedule 26.04.2012


Ответы (2)


Нет, не будет. Application.Exit() просто заставит насос сообщений Windows опубликовать сообщение о выходе, которое завершит основной поток вашего приложения. Однако сам процесс будет продолжать выполняться до тех пор, пока не завершатся фоновые потоки.

Обновление: как правильно заметили комментаторы, если для свойства IsBackground вашего потока установлено значение True, завершение основного потока с помощью Application.Exit() остановит процесс.

person pdriegen    schedule 25.04.2012
comment
Другие потоки переднего плана будут препятствовать завершению процесса, фоновые потоки - нет. - person Servy; 26.04.2012
comment
Ты уверен? Я думал, что фоновые потоки (т. е. потоки с IsBackground == true не препятствуют завершению приложения и принудительно завершаются при завершении работы. - person CodesInChaos; 26.04.2012
comment
Спасибо, так что не нужно беспокоиться, когда я использую Application.Exit, все фоновые потоки будут завершены. - person Mohamed; 26.04.2012
comment
Если вы используете ThreadPool, тогда IsBackground будет инициализировано для вас до true, поэтому они не будут препятствовать остановке приложения. - person Jeff B; 03.09.2014
comment
В WinCE8/CF3.9 даже установка IsBackground=true не позволяет остановить поток с помощью Application.Exit(). Единственный чистый и универсальный способ, который работает независимо от ОС и фреймворка, состоит в том, чтобы определить флаг в потоке, чтобы справиться с изящным окончанием, и установить этот флаг в значение True непосредственно перед выполнением Application.Exit(). - person LM.Croisez; 05.06.2020

Нет. Завершение потока является совместным.

person usr    schedule 25.04.2012