我试图弄清楚如何在以下情况下取消后台投手:
在一个Winform上,我有一个我调用的后台工作程序,基本上从服务中检索大量数据。此操作可能需要1秒到5分钟。所以,我所做的是创建了另一个Winform并在其上粘贴了一个选取框。
我想要做的是在Winform上添加一个取消按钮,其上有一个取消该背景工作者的进度条。
我当前的代码设置为:
this.backgroundWorker1.RunWorkerAsync();
pb = new frmProgressbar();
pb.Show();
while (this.backgroundWorker1.IsBusy)
{
Application.DoEvents();
}
pb.Dispose();
因此,这可以正常工作,因为它显示了进度条,而后台工作者正在匆匆忙忙,然后处理进度条表单。
但是,我需要找到一种方法来允许用户通过在frmProgressbar上放置一个取消按钮取消操作,该按钮将返回取消以终止后台工作者。有什么建议吗?
答案 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();