【问题标题】:C# - How to cancel background working from form with a progress bar?C# - 如何从带有进度条的表单中取消后台工作?
【发布时间】: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


【解决方案1】:

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

public class frmProgressbar : Form
{
    public event Action Canceled;

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

    //other stuff
}

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

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

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

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

【讨论】:

  • 我觉得自己很笨。如何在 DoWork 处理程序中检查取消?我已做出更改以反映您的上述建议,但不确定如何检查是否取消。
  • @user1949119 backgroundWorker1.CancellationPendingDoWork 的事件参数的Cancel 属性。
  • 我真的很抱歉我对此一无所知。在我的 backgroundWorker1_DoWork 事件中,我正在调用一个获取数据的方法。我仍然不知道如何在该事件中取消它。
  • @user1949119 如果您没有任何方法可以阻止它,或者无法更改它以使其支持取消,那么您期望它会做什么?如果它不支持取消,那么它不支持取消。当使用点击“取消”时,您最多可以做的是关闭进度条并让他们再次执行其他操作(只要其他操作可以在该操作仍在进行中工作)。
  • 感谢您对此的帮助和建议。我知道与不熟悉此类事情的人打交道可能会令人沮丧。我假设有一个“简单”的方法可以取消后台工作程序,因为它运行在与调用线程不同的线程中。以您的代码为例(我当然很欣赏),我在进度条表单上设置了公共事件,并修改了它调用后台工作程序的方式。后台工作者中的方法基本上是一个数据表,它是从对服务的调用中填充的。
猜你喜欢
  • 2017-09-04
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多