我有一个“刷新”按钮,每次点击它我都希望我的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”,我无法再次运行该对象...
每次我想要运行它时,我是否需要创建一个新的背景工作者?我该怎么做? 感谢。
答案 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,无论如何都将重复使用。