如何正确取消BackgroundWorker

时间:2013-05-24 19:44:12

标签: c# backgroundworker cancellation

我有一个GUI表单作为主线程,而我有一个不同的类,需要完成的实际工作。

有没有办法正确检查worker的CancellationPending属性,因为它是从另一个类激活的,除了将worker作为“DoJob”方法的参数传递,以便它可以检查属性?

代码(在主类中):

// This method is registered as the DoWork method for the worker
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    workClassInstance.DoJob();
}

private void buttonCancel_Click(object sender, RoutedEventArgs e)
{
    if (bw.WorkerSupportsCancellation == true)
    {
        bw.CancelAsync();
    }
}

1 个答案:

答案 0 :(得分:0)

不是真的;你几乎需要定期检查BGW的IsCancelled属性才能正确取消。如果某个给定的操作显然了解BGW很重要,那么有几个选项。


如果不暴露BGW非常重要,那么你可以做的一件事就是改用CancellationToken。您可以创建CancellationTokenSource并将其公开给负责取消任务的任何内容,然后将cts的Token值传递给负责取消的任何内容。


另一个选择是您可以将Func<bool>作为参数传递给DoJob。该函数在被调用时将返回该任务当前是否已请求取消。然后你会这样称呼它:

workClassInstance.DoJob(()=> worker.CancellationPending);

您现在已经隐藏了workClassInstance中的后台工作人员,并且只暴露了其所需功能的这一方面,即是否已请求取消。