是否可以重用backgroundworker对象?

时间:2011-03-19 19:17:01

标签: c# .net multithreading

我有一个“刷新”按钮,每次点击它我都希望我的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”,我无法再次运行该对象...

每次我想要运行它时,我是否需要创建一个新的背景工作者?我该怎么做? 感谢。

2 个答案:

答案 0 :(得分:6)

是的,没问题。但是,您必须确保在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;
    }

答案 1 :(得分:1)

  

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

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

首先,您必须决定是否要同时进行其中两项操作。

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

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

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