Фоновая форма закрыта без отмены асинхронного - PullRequest
0 голосов
/ 08 марта 2011

Я хочу знать, в чем может быть проблема, если у меня есть следующий POC ...

public void DoProcess() // called as Do_Work
{
    textUpdater = null;
    try
    {
        SetButtonEnabled(false);
        aHandler = new DataHandler();
        aHandler.Initialize(_configuration);
        aHandler.GetDataFromWebAndSave();
        MessageBox.Show("completed");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message + " \r\n\r\n" + ex.StackTrace);
    }
    SetButtonEnabled(true);
}

Обычно процесс backgroundWorker включает цикл, в котором можно легко увидеть, вызван ли метод cancel или нет.В моем случае я не могу проверить ... Скажем, я ЗАКРЫВАЮ форму Windows (содержащую приведенный выше код).Будет ли все благополучно завершено ??Если нет, то как я могу это сделать?(Я думаю, что другой способ может быть «использовать поток»).

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

Процесс ветки вашего фонового работника не должен иметь цикл. И это не должно быть отменено, чтобы закончить. Это просто заканчивается, когда ... процесс завершается! Когда он закончится, будет вызван RunWorkerCompleted.

Я вижу главную проблему в вашем вызове: вы управляете своим GUI из фонового потока. Это нет-нет! Все манипуляции с элементом GUI должны быть сделаны из потока, который создал элемент. В вашем случае используйте ReportProgress() для делегирования информации о состоянии обработчику ProgressChanged, который будет выполнять ее в потоке переднего плана.

Кроме того, как писал Rewinder, вы можете отменить работника с FormClosing(). Но если вы никогда не отслеживаете CancellationPending из вашего рабочего процесса, это бессмысленно.

0 голосов
/ 08 марта 2011

Если вы хотите убедиться, что ваш фоновый работник отменен, вы можете сделать что-то вроде этого:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
     myBackgroundWorker.CancelAsync();
}
...