【发布时间】:2013-11-02 06:44:31
【问题描述】:
我试图弄清楚如何在以下情况下取消后台工作:
在一个 Winform 上,我有一个后台工作程序,我称之为基本上从服务中检索大量数据。此操作可能需要 1 秒到 5 分钟。所以,我所做的是我创建了另一个 Winform 并在其上粘贴了一个选框进度条。
我想要做的是向那个 Winform 添加一个取消按钮,上面有进度条,可以取消该后台工作人员。
我当前的代码设置为:
this.backgroundWorker1.RunWorkerAsync();
pb = new frmProgressbar();
pb.Show();
while (this.backgroundWorker1.IsBusy)
{
Application.DoEvents();
}
pb.Dispose();
因此,这可以正常工作,因为它在后台工作人员运行时显示进度条,然后处理进度条表单。
但是,我需要找到一种方法来允许用户通过在 frmProgressbar 上放置一个取消按钮来取消操作,该按钮将返回一个取消来杀死后台工作程序。有什么建议吗?
【问题讨论】:
-
请,请,请不要使用
DoEvents,除非您真的确定您知道自己在做什么。它几乎总是适合这项工作的错误工具。如果您只是让主线程坐在那里等待它完成,那么创建另一个线程来完成工作是没有意义的。 -
向进度表单类添加一个公共事件,使用按钮的 Click 事件处理程序触发它。在您的 sn-p 中订阅该事件,让它调用 BGW 的 CancelAsync() 方法。
标签: c# winforms backgroundworker