BackgroundWorker为什么调用CancelAsync() ?

本文关键字:CancelAsync 为什么 调用 BackgroundWorker | 更新日期: 2023-09-27 17:54:49

我知道外面有很多关于bw的问题,但我仍然觉得有必要问这个问题/不觉得我得到了我想要的信息…或者有人用我能理解的方式给我解释一下……除了将CancellationPending标志设置为true之外,我看不到调用BW.CancelAsync()的实际目的…

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

或者同样的问题以不同的方式:我的代码是这样设置的,这是OK的还是我应该绝对调用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()的目的吗?

BackgroundWorker为什么调用CancelAsync() ?

表示取消按钮。如果你点击取消按钮,它会调用CancelAsync()。

在你的BackgroundWorker DoWork中,当E.Cancel =true时,你扫描。如果你检测到E.Cancel为真,那么你就以一种可控的方式停止后台工作线程中的代码。

这允许你在BackgroundWorker中清理你正在做的事情,而不是强制停止它。

你可以使用全局变量来做到这一点。CancelAsync只是一种更简洁的方式。