我知道那里有很多关于BW的问题,但我仍然觉得有必要提出这个问题/没有感觉我得到了我想要的信息......或者有人必须向我以一种我能理解的方式......除了将CancellationPending标志设置为true之外,我认为调用BW.CancelAsync()
没有实际目的......
基本上,我的问题是:为什么在BW上调用CancelAsync()
?
或者以不同的方式提出相同的问题:我的代码是这样设置的,这是好的还是应该在那里打电话给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()
更好的目的吗?
答案 0 :(得分:1)
用于取消按钮。如果单击取消按钮,则会调用CancelAsync()。
在BackgroundWorker DoWork中,您扫描E.Cancel = true。如果检测到E.Cancel为true,则以受控方式停止后台工作程序中的代码。
这允许您清理在BackgroundWorker中正在执行的操作,而不是强行将其停在原处。
您可以使用全局变量执行此操作。 CancelAsync只是一种更简洁的方式。