【问题标题】:How to properly cancel a BackgroundWorker如何正确取消 BackgroundWorker
【发布时间】:2023-03-23 14:51:01
【问题描述】:

我有一个作为主线程的 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();
    }
}

【问题讨论】:

    标签: c# backgroundworker cancellation


    【解决方案1】:

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


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


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

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

    您现在已经从workClassInstance 中“隐藏”了后台工作程序,并且只公开了它需要的功能方面,即是否已请求取消。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-17
      • 2010-10-12
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多