Простой вопрос, чтобы повторить заголовок:
Закрывает ли приложение WinForms все активные BackgroundWorkers?
Простой вопрос, чтобы повторить заголовок:
Закрывает ли приложение WinForms все активные BackgroundWorkers?
Да, это так.
BackgroundWorker.RunWorkerAsync
просто вызывает BeginInvoke
во внутреннем делетете, который, в свою очередь, ставит очередь на запрос ThreadPool
. Поскольку все потоки ThreadPool
background, да, это закончится, когда приложение закончится.
Однако имейте в виду, что:
"Закрывая приложение WinForms", я предполагаю закрыть основной экземпляр Form
(который обычно передается Application.Run
в классе Program
, автоматически генерируемом Visual Studio). Если у вас есть дочернее окно с фоновым рабочим, оно не остановит его BackgroundWorker
автоматически.
Чтобы исключить фоновый поток при выходе приложения, не рекомендуемый способ прекратить поток, так как у вас нет гарантий, где он будет прерван. Лучше всего было бы предупредить рабочего перед закрытием, дождаться, когда он закончит грациозно, а затем выйдет.
Дополнительная информация: Delegate.BeginInvoke, MSDN для пула потоков, Thread.IsBackground
Единственный способ, с помощью которого поток может выполняться после прекращения работы основного потока (UI), если он был создан явно, путем создания нового экземпляра Thread и установки IsBackground в false. Если вы этого не сделаете (или если вы используете ThreadPool, который порождает фоновые потоки, или BackgroundWorker, который также использует ThreadPool внутри), ваш поток будет фоновым потоком и будет завершен, когда заканчивается основной поток.
Темы BackgroundWorker являются фоновыми потоками (ThreadPool threads), которые когда приложение умирает.
Да, будет. Я написал эту простую форму, и закрытие формы выходит из приложения:
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);
}
}
}
Если приложение полностью закрывается (так как ничто не мешает ему закрыться), фоновые работники также исчезнут.
Как только процесс исчез, все связанные потоки также исчезли.
Прежде всего, просто чтобы сделать этот ответ простым:
Когда процесс закрыт, все его потоки прекратились. Там нет вопроса об этом.
Вопрос, как я его интерпретирую, таким образом становится следующим:
Будут ли все еще запущенные экземпляры
BackgroundWorker
запретить закрытие приложения?
Ответ на этот вопрос: Нет, они не будут.
Я думаю, да. Поскольку потоки связаны с процессом, и если процесс закрыт, все потоки должны заканчиваться.