如果我点击一个启动后台工作器两次的按钮,就会出现这个错误。
This BackgroundWorker is currently busy and cannot run multiple tasks concurrently
我该如何避免这种情况?
如果我点击一个启动后台工作器两次的按钮,就会出现这个错误。
This BackgroundWorker is currently busy and cannot run multiple tasks concurrently
我该如何避免这种情况?
简单易懂:不要两次启动 BackgroundWorker。
你可以使用 IsBusy
属性来检查它是否已经在运行,所以只需要修改这段代码:
worker.RunWorkerAsync();
转换为:
if( !worker.IsBusy )
worker.RunWorkerAsync();
else
MessageBox.Show("Can't run the worker twice!");
更新:
如果您确实需要同时启动多个后台任务,可以简单地创建多个BackgroundWorker对象。
为每个要执行的操作创建一个新的BackgroundWorker对象。也就是说,不要这样做:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
for (int i; i < max; i++) {
worker.RunWorkerAsync(i);
}
试一下这个:
for (int i; i < max; i++) {
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync(i);
}
if (BckgrndWrkr == null)
{
BckgrndWrkr = new BackgroundWorker();
BckgrndWrkr.DoWork += DoWorkMethod;
BckgrndWrkr.RunWorkerAsync();
}
else if (!BckgrndWrkr.IsBusy)
{
BckgrndWrkr.RunWorkerAsync();
}
else if
并启动了后台工作器,在第一个实例到达if
块的RunWorkerAsync之前,然后它就会抛出错误。
IsBusy
什么时候被清除?我本以为它会在RunWorkerCompleted
事件触发之前被清除,但根据我的实验情况并不是这样。 - Woodrow Barlow