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