是否可以重用backgroundworker对象?

问题描述:

我有一个按钮“刷新”,每次我点击它,我想我的backgroundworker对象工作。是否可以重用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属性的对象是'真',我不能再运行该对象...

我是否需要创建一个新的backgroundworker每次我想运行它?我该怎么做? 谢谢。

+0

“是的,但不是并发”http://*.com/questions/681076/reusing-the-backgroundworker-more-than-once – ceyko 2011-03-19 19:29:46

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

我如何创建一个新的backgroundworker每次我想运行该方法?以及如何处置前一个,以便记忆不会丢失。谢谢。 – 2011-03-20 11:51:25

+0

我的答案是,你*不必每次都创建一个新的BGW。你可以但我不会推荐它,当你有多个bgws运行时,关闭窗体是很平常的。问Henk。 – 2011-03-20 12:19:38

但我第二次尝试运行对象的对象的is_busy属性为“真”

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

您首先必须决定是否要让这些操作中的两个同时进行。

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

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

尽管您可以重新使用Bgw,并且这在第一种情况下是有意义的,但是这样做并没有很大的节约。 Bgw线程来自ThreadPool,无论如何都将被重新使用。

+0

“执行取消,以便您可以停止(然后重新启动)Bgw”我如何执行取消?使用main_news_back_worker.CancelAsync()不工作...... – 2011-03-19 19:57:04

+0

@Michael,你在DoWork的代码必须合作。请参阅http://msdn.microsoft.com/zh-CN/library/system.componentmodel.backgroundworker.aspx – 2011-03-19 20:05:23