如何正确地取消BackgroundWorker

本文关键字:BackgroundWorker 取消 正确地 | 更新日期: 2023-09-27 18:15:29

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

是否有一种方法可以正确检查工作器的CancellationPending属性,因为它是从不同的类激活的,而不是将工作器作为"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();
    }
}

如何正确地取消BackgroundWorker

不完全是;你很有必要定期检查BGW的IsCancelled属性以正确取消。如果一个给定的操作明确地知道BGW是很重要的,那么有几个选择。


如果不暴露BGW真的很重要,你可以做的一件事是使用CancellationToken代替。您可以创建一个CancellationTokenSource并将其公开给负责取消任务的任何对象,然后将cts的Token值传递给负责取消任务的任何对象。


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

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

您现在已经从workClassInstance中"隐藏"了后台工作器,并且只暴露了它需要的功能方面,即是否已请求取消

相关文章:
  • 没有找到相关文章