如何正确地取消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();
}
}
不完全是;你很有必要定期检查BGW的IsCancelled
属性以正确取消。如果一个给定的操作明确地不知道BGW是很重要的,那么有几个选择。
如果不暴露BGW真的很重要,你可以做的一件事是使用CancellationToken
代替。您可以创建一个CancellationTokenSource
并将其公开给负责取消任务的任何对象,然后将cts的Token
值传递给负责取消任务的任何对象。
另一个选项是,您可以将Func<bool>
作为参数传递给DoJob
。当调用该函数时,将返回任务当前是否请求取消。然后你可以这样调用它:
workClassInstance.DoJob(()=> worker.CancellationPending);
您现在已经从workClassInstance
中"隐藏"了后台工作器,并且只暴露了它需要的功能方面,即是否已请求取消