我有一个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();
}
}
答案 0 :(得分:0)
不是真的;你几乎需要定期检查BGW的IsCancelled
属性才能正确取消。如果某个给定的操作显然不了解BGW很重要,那么有几个选项。
如果不暴露BGW非常重要,那么你可以做的一件事就是改用CancellationToken
。您可以创建CancellationTokenSource
并将其公开给负责取消任务的任何内容,然后将cts的Token
值传递给负责取消的任何内容。
另一个选择是您可以将Func<bool>
作为参数传递给DoJob
。该函数在被调用时将返回该任务当前是否已请求取消。然后你会这样称呼它:
workClassInstance.DoJob(()=> worker.CancellationPending);
您现在已经隐藏了workClassInstance
中的后台工作人员,并且只暴露了其所需功能的这一方面,即是否已请求取消。