C# backgroundworker窗体已关闭,但未取消异步
我想知道如果我有以下POC,会有什么问题C# backgroundworker窗体已关闭,但未取消异步,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,我想知道如果我有以下POC,会有什么问题 public void DoProcess() // called as Do_Work { textUpdater = null; try { SetButtonEnabled(false); aHandler = new DataHandler(); aHandler.Initialize(_configuration); aHandler.GetDataFrom
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窗体(包含上述代码)。一切都会安全终止吗??
如果没有,我怎么做?
(我想另一种方法可能是“使用线程”)。如果您想确保您的backgroundworker被取消,您可以执行以下操作:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
myBackgroundWorker.CancelAsync();
}
如果要确保取消backgroundworker,可以执行以下操作:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
myBackgroundWorker.CancelAsync();
}
backgroundworker的线程进程不必有循环。而且它不必被取消就可以完成。它只是在。。。程序退出! 完成后,将调用
RunWorkerCompleted
不过,我在您的调用中看到了一个主要问题:您从后台线程操作GUI。这是一个禁忌!GUI元素的所有操作都必须从创建该元素的线程进行。在您的情况下,使用
ReportProgress()
将状态信息委托给将在前台线程中执行的ProgressChanged
处理程序
此外,正如Rewinder所写,您可以从
FormClosing()
取消工作进程。但是,如果您从未从工作进程监视取消挂起,这是毫无意义的。后台工作进程的线程进程不必有循环。而且它不必被取消就可以完成。它只是在。。。程序退出!
完成后,将调用RunWorkerCompleted
不过,我在您的调用中看到了一个主要问题:您从后台线程操作GUI。这是一个禁忌!GUI元素的所有操作都必须从创建该元素的线程进行。在您的情况下,使用
ReportProgress()
将状态信息委托给将在前台线程中执行的ProgressChanged
处理程序
此外,正如Rewinder所写,您可以从
FormClosing()
取消工作进程。但是,如果您从未从worker进程中监视CancellationPending
,这是毫无意义的。“GUI元素的所有操作都必须从创建该元素的线程中进行。”--您能解释一下吗??“GUI元素的所有操作都必须从创建该元素的线程中进行。”--你能再解释一下吗????