是否可以重用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每次我想运行它?我该怎么做? 谢谢。
是的,没问题。然而,您必须确保在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;
}
我如何创建一个新的backgroundworker每次我想运行该方法?以及如何处置前一个,以便记忆不会丢失。谢谢。 – 2011-03-20 11:51:25
我的答案是,你*不必每次都创建一个新的BGW。你可以但我不会推荐它,当你有多个bgws运行时,关闭窗体是很平常的。问Henk。 – 2011-03-20 12:19:38
但我第二次尝试运行对象的对象的is_busy属性为“真”
这意味着第一个后台操作仍在运行。
您首先必须决定是否要让这些操作中的两个同时进行。
如果否,请执行取消,以便您可以停止(然后重新启动)Bgw。
如果是,则每次创建一个新的Bgw。
尽管您可以重新使用Bgw,并且这在第一种情况下是有意义的,但是这样做并没有很大的节约。 Bgw线程来自ThreadPool,无论如何都将被重新使用。
“执行取消,以便您可以停止(然后重新启动)Bgw”我如何执行取消?使用main_news_back_worker.CancelAsync()不工作...... – 2011-03-19 19:57:04
@Michael,你在DoWork的代码必须合作。请参阅http://msdn.microsoft.com/zh-CN/library/system.componentmodel.backgroundworker.aspx – 2011-03-19 20:05:23
“是的,但不是并发”http://stackoverflow.com/questions/681076/reusing-the-backgroundworker-more-than-once – ceyko 2011-03-19 19:29:46