【问题标题】:Is The reuse of the backgroundworker object possible?是否可以重用 backgroundworker 对象?
【发布时间】:2011-03-20 03:40:16
【问题描述】:

我有一个“刷新”按钮,每次我点击它时,我都希望我的 backgroundworker 对象工作。

我用

if (main_news_back_worker.IsBusy != true)
        {
            // Start the asynchronous operation.

            main_news_back_worker.RunWorkerAsync();
        }
private void main_news_back_worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        show_system_urls(urls);
        displayNewMes(newMes, newStock, newSource);
        displayOldMes(oldMes, oldStock);

    }

我第一次使用 backgroundworker 时它工作得很好,并且还可以到达 RunWorkerCompleted 并完成他的工作。 但是我第二次尝试运行该对象时,该对象的 is_busy 属性为“true”,我无法再次运行该对象...

每次我想运行它时都需要创建一个新的后台工作程序吗?我该怎么做? 谢谢。

【问题讨论】:

标签: c# .net multithreading


【解决方案1】:

是的,没问题。但是,您必须确保在 BGW 忙时用户不能再次单击该按钮。通过设置 Enabled 属性轻松完成,停止按钮操作并向用户提供出色的视觉反馈。试试这个例子:

    private void button1_Click(object sender, EventArgs e) {
        button1.Enabled = false;
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
        System.Threading.Thread.Sleep(2000);
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        button1.Enabled = true;
    }

【讨论】:

  • 每次我想运行该方法时如何创建一个新的后台工作程序?以及如何处理前一个,以免丢失记忆。谢谢。
  • 我回答的重点是您不必每次都创建一个新的 BGW。你可以,但我不推荐它,当你有多个 bgws 运行时,干净地关闭表单是非常不重要的。问亨克。
【解决方案2】:

但我第二次尝试运行该对象时,该对象的 is_busy 属性为 'true'

这意味着第一个后台操作仍在运行。

您首先必须决定是否要同时执行其中 2 个操作。

如果否,请实施取消,以便您可以停止(然后重新启动)Bgw。

如果是,则每次创建一个新的 Bgw。

虽然您可以重复使用 Bgw,这在第一种情况下是有意义的,但这样做并没有很大的节省。 Bgw Thread 来自 ThreadPool,无论如何都会被重用。

【讨论】:

  • "实现取消,以便您可以停止(然后重新启动)Bgw" 我如何执行取消?使用 main_news_back_worker.CancelAsync() 不起作用...
  • @Michael,您在 DoWork 中的代码必须合作。见msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多