Закрытие приложения останавливает весь активный BackgroundWorkers?

Как насчет ковариантные типы возврата , которые существовали начиная с JDK 1.5? Это довольно плохо разглашено, поскольку это - несексуальное дополнение, но насколько я понимаю, абсолютно необходимо для дженериков работать.

По существу, компилятор теперь позволяет подклассу сужать тип возврата переопределенного метода быть подклассом типа возврата исходного метода. Таким образом, это позволяется:

class Souper {
    Collection<String> values() {
        ...
    }
}

class ThreadSafeSortedSub extends Souper {
    @Override
    ConcurrentSkipListSet<String> values() {
        ...
    }
}

можно назвать подкласс values метод и получить отсортированное ориентированное на многопотоковое исполнение Set из String s , не имея необходимость вниз бросать к ConcurrentSkipListSet.

11
задан tshepang 4 February 2014 в 00:40
поделиться

8 ответов

Да, это так.

BackgroundWorker.RunWorkerAsync просто вызывает BeginInvoke внутреннего делегата, который, в свою очередь, помещает запрос в ThreadPool . Так как все потоки ThreadPool являются фоновыми , да, они закончатся, когда приложение завершится.

Однако имейте в виду, что:

  1. «закрывая приложение WinForms» я Я предполагаю, что закрываю экземпляр main Form (обычно он передается в Application.Run в классе Program , созданном автоматически Visual Studio) . Если у вас есть дочернее окно с фоновым рабочим, оно не остановит свой BackgroundWorker автоматически.

  2. Разрешение прерывания фонового потока при выходе из приложения является не рекомендуемым способом завершения потока, поскольку у вас нет гарантий, где он будет прерван. Гораздо лучше было бы сигнализировать работнику перед закрытием, дождаться его корректного завершения и затем выйти.

Дополнительная информация: Delegate.BeginInvoke , MSDN on Thread Pooling , Thread.IsBackground

18
ответ дан 3 December 2019 в 02:40
поделиться

Единственный способ, которым поток может продолжить выполнение после остановки вашего основного (UI) потока, - это если он был создан явно, путем создания нового экземпляра потока и установки для IsBackground значения false. Если вы этого не сделаете (или если вы используете ThreadPool, который порождает фоновые потоки, или BackgroundWorker, который также использует ThreadPool внутри), ваш поток будет фоновым потоком и будет завершен, когда основной поток завершится.

7
ответ дан 3 December 2019 в 02:40
поделиться

Потоки BackgroundWorker - это фоновые потоки ( ThreadPool потоки), , которые умирают, когда приложение умирает .

6
ответ дан 3 December 2019 в 02:40
поделиться

Да, будет. Я написал эту простую форму, и закрытие формы приводит к выходу из приложения:

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);
        }
    }
}
1
ответ дан 3 December 2019 в 02:40
поделиться

Вы не можете изменить часовой пояс GWT, следовательно, все java.util.Date имеют часовой пояс браузера. Вам нужно будет обработать текущую настройку часового пояса вручную.

Я вижу 3 варианта:

  1. Вы сами управляете преобразованием часового пояса.

  2. Вы переопределяете сериализатор / десериализатор java.util.Date как в этом сообщении . И, возможно, с использованием специальной реализации java.util.Date , которая переопределяет getTimezoneOffset () . Этот подход требует перекомпиляции GWT API!.

  3. Вы реализуете свою собственную дату, либо расширяя java.util.Date (как в варианте 2), либо оборачивая его некоторым объектом часового пояса. В этом варианте CustomFieldSerializer все еще может быть полезен,

0
ответ дан 3 December 2019 в 02:40
поделиться

После завершения процесса все связанные потоки также исчезают.

0
ответ дан 3 December 2019 в 02:40
поделиться

Прежде всего, просто для упрощения этого ответа:

Когда процесс закрывается, все его потоки завершаются. Здесь нет никаких сомнений.

Вопрос, как я его понимаю, становится таким:

Будут ли все еще работающие экземпляры BackgroundWorker препятствовать закрытию приложения?

Ответ на этот вопрос: нет, не будут.

0
ответ дан 3 December 2019 в 02:40
поделиться

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

-1
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: