我想中止该过程但无法这样做,我正在使用后台工作程序和我的处理功能。
public void Init()
{
bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
if (bw.CancellationPending == true)
{
e.Cancel = true;
}
else
{
e.Result = abd();
}
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Cancelled)
{
lbltext.content="Canceled";
}
else
{
lbltext.content="Completed";
}
}
private void btncan_Click(object sender, RoutedEventArgs e)
{
bw.CancelAsync();
}
private void btnstart_Click(object sender, RoutedEventArgs e)
{
bw.RunWorkerAsync();
}
我无法使用此代码中止进程。
函数 abd()
正在执行处理部分并返回结果。
请提供任何解决方案。
谢谢。
最佳答案
当您调用 bw.CancelAsync()
时,您只需将 CancellationPending
标志设置为 true
。默认情况下它不会取消某些内容。您需要手动处理挂起的取消。但是你不能用你的代码做到这一点,因为当你点击按钮时,有三个可能的选项:
- 长时间运行的
abd()
方法完成了它的工作,没有什么可以取消的 abd()
开始工作,后台工作程序被阻塞 - 它正在等待abd()
的结果,然后继续执行 - 即退出if -else
阻止并引发RunWorkerCompleted
事件。- 几乎不可能的选择 - 你会像光一样快,你会在
if-else
block 进入之前点击按钮。CancellationPending
将为真,abd()
将不会开始执行
如果你想使用取消,那么在一个循环中执行你的长时间运行的任务,并检查取消是否在每个步骤中挂起:
void bw_DoWork(object sender, DoWorkEventArgs e)
{
List<Foo> results = new List<Foo>();
// any loop here - foreach, while
for(int i = 0; i < steps_count; i++)
{
// check status on each step
if (bw.CancellationPending == true)
{
e.Cancel = true;
return; // abort work, if it's cancelled
}
results.Add(abd()); // add part of results
}
e.Result = results; // return all results
}
关于C#-后台 worker 的 CancelAsync() 不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18314873/