C# - 如何使用进度条从表单中取消后台工作?

时间:2013-10-23 19:52:25

标签: c# winforms backgroundworker

我试图弄清楚如何在以下情况下取消后台投手:

在一个Winform上,我有一个我调用的后台工作程序,基本上从服务中检索大量数据。此操作可能需要1秒到5分钟。所以,我所做的是创建了另一个Winform并在其上粘贴了一个选取框。

我想要做的是在Winform上添加一个取消按钮,其上有一个取消该背景工作者的进度条。

我当前的代码设置为:

this.backgroundWorker1.RunWorkerAsync();
pb = new frmProgressbar();
pb.Show();

while (this.backgroundWorker1.IsBusy)
{
   Application.DoEvents();
}

pb.Dispose();

因此,这可以正常工作,因为它显示了进度条,而后台工作者正在匆匆忙忙,然后处理进度条表单。

但是,我需要找到一种方法来允许用户通过在frmProgressbar上放置一个取消按钮取消操作,该按钮将返回取消以终止后台工作者。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

首先在进度条窗体中添加一个事件,以指示何时取消,然后在单击相关按钮时触发:

public class frmProgressbar : Form
{
    public event Action Canceled;

    void btnCancel_Click(object sender, EventArgs e)
    {
        if (Canceled != null)
            Canceled();
    }

    //other stuff
}

然后在您的另一种形式中,您可以创建一个新的进度条,让它取消后台工作程序(内置有自己的取消支持),然后显示它。您还可以向已完成的事件添加处理程序以关闭进度条(而不是尝试等待BGW)。然后启动工人。

您还需要检查整个DoWork处理程序中的取消,以便在请求取消时停止工作:

var pb = new frmProgressbar();
pb.Canceled += ()=> backgroundWorker1.CancelAsync();
pb.Show();

backgroundWorker1.RunWorkerCompleted += (s, args) => pb.Close();
backgroundWorker1.RunWorkerAsync();