BackgroundWorker为什么调用CancelAsync()?

时间:2014-03-28 18:06:36

标签: c# backgroundworker

我知道那里有很多关于BW的问题,但我仍然觉得有必要提出这个问题/没有感觉我得到了我想要的信息......或者有人必须向我以一种我能理解的方式......除了将CancellationPending标志设置为true之外,我认为调用BW.CancelAsync()没有实际目的......

基本上,我的问题是:为什么在BW上调用CancelAsync()

或者以不同的方式提出相同的问题:我的代码是这样设置的,这是好的还是应该在那里打电话给CancelAsync()CancelAsync()为此代码无法处理的目的是什么?

这有点沮丧,但无论如何你都会得到一般的想法。

void BW_DoWork(object sender, DoWorkEventArgs e)
{
    Process_Status LastProcessed = Process_Status.None;

    foreach(Iteration iter in Iterations)
    {
        //global form flag set when user presses CANCEL AND ROLLBACK button...
        if (!this.IsRollBack)
        {
            try
            {
                //DO SOME WORK HERE
                LastProcessed = Process_Status.SomethingSucceeded;
            }
            catch
            {
                this.LastFail = Process_Status.SomethingFailed;
                //this, for me, cancels the thread and runs RunWorkerCompleted...
                e.Cancel = true;
            }
        }
        else
        {
            this.LastFail = LastProcessed;
            //this, for me, cancels the thread and runs RunWorkerCompleted...
            e.Cancel = true;
        }
    }
}

然后在RunWorkerCompleted ......

void BW_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        switch(this.LastFail)
        {
             //DO SOMETHING MEANINGFUL HERE BASED ON GLOBAL STATUS...
        }
    }
}

有人可以帮我理解CancelAsync()更好的目的吗?

1 个答案:

答案 0 :(得分:1)

用于取消按钮。如果单击取消按钮,则会调用CancelAsync()。

在BackgroundWorker DoWork中,您扫描E.Cancel = true。如果检测到E.Cancel为true,则以受控方式停止后台工作程序中的代码。

这允许您清理在BackgroundWorker中正在执行的操作,而不是强行将其停在原处。

您可以使用全局变量执行此操作。 CancelAsync只是一种更简洁的方式。