BackgroundWorker为什么调用CancelAsync() ?
本文关键字:CancelAsync 为什么 调用 BackgroundWorker | 更新日期: 2023-09-27 17:54:49
我知道外面有很多关于bw的问题,但我仍然觉得有必要问这个问题/不觉得我得到了我想要的信息…或者有人用我能理解的方式给我解释一下……除了将CancellationPending标志设置为true之外,我看不到调用BW.CancelAsync()
的实际目的…
所以基本上,我的问题是:为什么在BW上调用CancelAsync()
?
或者同样的问题以不同的方式:我的代码是这样设置的,这是OK的还是我应该绝对调用CancelAsync()
在那里?CancelAsync()
的目的是什么,这段代码不能处理?
这是一个比较简单的例子,但是你还是能理解它的大意。
void BW_DoWork(object sender, DoWorkEventArgs e)
{
Process_Status LastProcessed = Process_Status.None;
foreach(Iteration iter in Iterations)
{
//global form flag set when user presses CANCEL AND ROLLBACK button...
if (!this.IsRollBack)
{
try
{
//DO SOME WORK HERE
LastProcessed = Process_Status.SomethingSucceeded;
}
catch
{
this.LastFail = Process_Status.SomethingFailed;
//this, for me, cancels the thread and runs RunWorkerCompleted...
e.Cancel = true;
}
}
else
{
this.LastFail = LastProcessed;
//this, for me, cancels the thread and runs RunWorkerCompleted...
e.Cancel = true;
}
}
}
然后在RunWorkerCompleted…
void BW_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
switch(this.LastFail)
{
//DO SOMETHING MEANINGFUL HERE BASED ON GLOBAL STATUS...
}
}
}
有人能帮我更好地理解CancelAsync()
的目的吗?
表示取消按钮。如果你点击取消按钮,它会调用CancelAsync()。
在你的BackgroundWorker DoWork中,当E.Cancel =true时,你扫描。如果你检测到E.Cancel为真,那么你就以一种可控的方式停止后台工作线程中的代码。
这允许你在BackgroundWorker中清理你正在做的事情,而不是强制停止它。
你可以使用全局变量来做到这一点。CancelAsync只是一种更简洁的方式。