Закрывает ли приложение все активные BackgroundWorkers?
Простой вопрос, чтобы повторить заголовок:
Закрывает ли приложение WinForms все активные BackgroundWorkers?
Ответы
Ответ 1
Да, это так.
BackgroundWorker.RunWorkerAsync
просто вызывает BeginInvoke
во внутреннем делетете, который, в свою очередь, ставит очередь на запрос ThreadPool
. Поскольку все потоки ThreadPool
background, да, это закончится, когда приложение закончится.
Однако имейте в виду, что:
-
"Закрывая приложение WinForms", я предполагаю закрыть основной экземпляр Form
(который обычно передается Application.Run
в классе Program
, автоматически генерируемом Visual Studio). Если у вас есть дочернее окно с фоновым рабочим, оно не остановит его BackgroundWorker
автоматически.
-
Чтобы исключить фоновый поток при выходе приложения, не рекомендуемый способ прекратить поток, так как у вас нет гарантий, где он будет прерван. Лучше всего было бы предупредить рабочего перед закрытием, дождаться, когда он закончит грациозно, а затем выйдет.
Дополнительная информация: Delegate.BeginInvoke, MSDN для пула потоков, Thread.IsBackground
Ответ 2
Единственный способ, с помощью которого поток может выполняться после прекращения работы основного потока (UI), если он был создан явно, путем создания нового экземпляра Thread и установки IsBackground в false. Если вы этого не сделаете (или если вы используете ThreadPool, который порождает фоновые потоки, или BackgroundWorker, который также использует ThreadPool внутри), ваш поток будет фоновым потоком и будет завершен, когда заканчивается основной поток.
Ответ 3
Темы BackgroundWorker являются фоновыми потоками (ThreadPool threads), которые когда приложение умирает.
Ответ 4
Да, будет. Я написал эту простую форму, и закрытие формы выходит из приложения:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
Thread.Sleep(100);
}
}
}
Ответ 5
Если приложение полностью закрывается (так как ничто не мешает ему закрыться), фоновые работники также исчезнут.
Ответ 6
Как только процесс исчез, все связанные потоки также исчезли.
Ответ 7
Прежде всего, просто чтобы сделать этот ответ простым:
Когда процесс закрыт, все его потоки прекратились. Там нет вопроса об этом.
Вопрос, как я его интерпретирую, таким образом становится следующим:
Будут ли все еще запущенные экземпляры BackgroundWorker
запретить закрытие приложения?
Ответ на этот вопрос: Нет, они не будут.
Ответ 8
Я думаю, да. Поскольку потоки связаны с процессом, и если процесс закрыт, все потоки должны заканчиваться.