C#-后台 worker 的 CancelAsync() 不工作?

标签 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();
}

我无法使用此代码中止进程。 函数 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/

相关文章:

c# - 我正在尝试读取 c# 中进程的输出,但收到此消息 "Cannot mix synchronous and asynchronous operation on process stream."

c# - 后台 worker 事件处理

c# - 如何在每个逗号处打断一个字符串?

c# - 使用来自 C++ dll 的 __declspec(dllexport) 签名声明在 C# 中调用

.net - 在 backgroundworker 中使用 Thread.Sleep 方法有什么好处?

vb.net - 如何将文本参数传递给 ProgressChanged?

c# - BackgroundWorker 超时

c# - 如果至少有一个任务结束,如何关闭所有任务

c# - 调用 DoubleClick Bid Manager API

c# - Winforms调用async方法挂掉程序