Закрывает ли приложение все активные 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 внутри), ваш поток будет фоновым потоком и будет завершен, когда заканчивается основной поток.

Ответ 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

Я думаю, да. Поскольку потоки связаны с процессом, и если процесс закрыт, все потоки должны заканчиваться.