Nee*_*sin 10 c# backgroundworker
我想中止该过程但不能这样做,我正在使用后台工作程序和我的处理功能.
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();
}
Run Code Online (Sandbox Code Playgroud)
我无法使用此代码中止该过程.功能abd()正在执行处理部分并返回结果.
请给我任何解决方案.
谢谢.
Ser*_*kiy 12
当你打电话给bw.CancelAsync()你时,只需设置CancellationPending标志即可true.默认情况下它不会取消某些内容.您需要手动处理待处理的取消.但是你不能用你的代码做到这一点,因为当你点击按钮时,有三种可能的选择:
abd()方法完成了它的工作,没有什么可以取消abd()开始它的工作,后台工作程序被阻止 - 它正在等待结果abd(),然后它继续执行 - 即退出if-else阻止并引发RunWorkerCompleted事件.if-else输入块之前单击按钮.比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
}
Run Code Online (Sandbox Code Playgroud)