后台工作者上的退出功能.CancellationPending==true
本文关键字:CancellationPending true 功能 退出 工作者 后台 | 更新日期: 2023-09-27 18:24:29
我目前正试图让我的一个函数在backgroundworker.CancellationPending == true
时自行取消。
我有一门课是这样的:
public class ImportPostManager
{
public event ProgressChangedEventHandler ProgressChanged;
protected virtual void OnProgressChanged(int progress)
{
if (ProgressChanged != null)
{
ProgressChanged(this, new ProgressChangedEventArgs(progress, null));
}
}
public void DoSomeStuff()
{
while(something == true)
{
if(backgroundworker.CancellationPending) return; //Here's my problem
//KeepDoingStuff and report progress
}
}
}
我从backgroundworker.DoWork()
中的窗体调用函数,但如何让类侦听backgroundworker.CancellationPending
?我不能在.DoWork()
中执行,因为它看起来像这样:
void _progressDialog_DoWork(object sender, DoWorkEventArgs e)
{
Managers.ImportPostManager.Instance.ProgressChanged += (s, pe) => dialog.ReportProgress(pe.ProgressPercentage, null, pe.ProgressPercentage.ToString() + "%);
Managers.ImportPostManager.Instance.DoSomeStuff();
}
并且我不希望将后台工作者发送到函数CCD_ 5。有没有办法利用事件或其他东西来获得我想要的东西?我还没有找到任何东西可以解释如何以我能理解的方式。。。
如果您对DoSomeStuff
没有直接传递给工作者感到满意,并且假设它是阻塞的(看起来很公平),那么您最好的选择可能是向函数添加Func<bool>
参数。
public void DoSomeStuff(Func<bool> ShouldCancel)
{
while (whatever == whateverElse && !ShouldCancel())
{
// Do work
}
}
然后您可以从DoWork
处理程序调用它。
void _progressDialog_DoWork(object sender, DoWorkEventArgs e)
{
Managers.ImportPostManager.Instance.ProgressChanged += (s, pe) => dialog.ReportProgress(pe.ProgressPercentage, null, pe.ProgressPercentage.ToString() + "%);
Managers.ImportPostManager.Instance.DoSomeStuff(() => backgroundworker.CancellationPending);
}
每一次都会得到评估,生活会很好。
尽管如果你担心这种情况经常发生,但可能值得研究一种更高级的多线程形式,即使只是通过System.Threading.Tasks
命名空间提供的。在那里,您将有更多的取消选项。但是,如果你正在寻找快速而简单的东西,添加该函数就可以了,而且它可以在多个上下文中工作,所以如果你将来选择不使用后台工作者,你的助手类就不会与它联系在一起。
当然,如果您没有使用BackgroundWorker.CancellationPending
属性(或者,如果我没有记错的话,使用Cancel()
方法)进行绑定,那么您可以更改该函数并签入CancellationToken
,然后简单地针对它(或者更确切地说,针对它的CancellationTokenSource
)调用Cancel()
。这在某些方面并不理想,但如果你最终想搬到更先进的地方,就像我之前说的那样,那会更干净一些。当然,如果你现在设置了函数,你也可以很容易地将令牌分层在DoSomeStuff
上,所以你不会永远根据你现在的选择来选择其中一个。