2

我试图弄清楚如何在以下情况下取消后台工作程序:

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

我想要做的是向那个 Winform 添加一个取消按钮,上面有进度条,它将取消该后台工作程序。

我当前的代码设置为:

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

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

pb.Dispose();

因此,这可以正常工作,因为它在后台工作人员运行时显示进度条,然后处理进度条表单。

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

4

1 回答 1

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();
于 2013-10-23T20:02:11.193 回答