backgroundworker表单关闭而没有取消异步

时间:2011-03-08 07:18:48

标签: c# winforms backgroundworker

如果我有以下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。就我而言,我无法检查...... 说我关闭窗体(包含上面的代码)。一切都会安全终止吗? 如果没有,那我该怎么办呢? (我猜其他方式可能是'使用线程')。

2 个答案:

答案 0 :(得分:3)

你的backgroundworker的线程proc不必有循环。并且不必取消即可完成。它只是完成... ... proc退出! 完成后,将调用RunWorkerCompleted

我在你的电话中看到了一个主要问题:你从后台线程操纵你的GUI。这是禁忌!必须从创建元素的线程中对GUI元素进行所有操作。在您的情况下,使用ReportProgress()将状态信息委托给将在前台线程中执行它的ProgressChanged处理程序。

此外,正如Rewinder所写,您可以从FormClosing()取消该工作人员。但是,如果你从不监视工作程序中的CancellationPending,那就毫无意义了。

答案 1 :(得分:0)

如果你想确保你的背景工作者被取消,你可以这样做:

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