Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# backgroundworker窗体已关闭,但未取消异步_C#_Winforms_Backgroundworker - Fatal编程技术网

C# backgroundworker窗体已关闭,但未取消异步

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

我想知道如果我有以下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窗体(包含上述代码)。一切都会安全终止吗?? 如果没有,我怎么做?
(我想另一种方法可能是“使用线程”)。

如果您想确保您的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元素的所有操作都必须从创建该元素的线程中进行。”--你能再解释一下吗????