当前位置:  开发笔记 > 编程语言 > 正文

此BackgroundWorker当前正忙,无法同时运行多个任务

如何解决《此BackgroundWorker当前正忙,无法同时运行多个任务》经验,为你挑选了3个好方法。

如果我单击一个启动backgroundworker两次的按钮,我会收到此错误.

This BackgroundWorker is currently busy and cannot run multiple tasks concurrently

我怎么能避免这个?



1> Orion Edward..:

简单:不要两次启动BackgroundWorker.

您可以使用该IsBusy属性检查它是否已在运行,因此只需更改此代码:

worker.RunWorkerAsync();

对此:

if( !worker.IsBusy )
    worker.RunWorkerAsync();
else
    MessageBox.Show("Can't run the worker twice!");

更新:

如果确实需要同时启动多个后台任务,则只需创建多个BackgroundWorker对象即可



2> Justin R...:

为要执行的每个操作创建一个新的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);
}


@VladSpreys如果你想要一个对worker的引用列表,那么在for循环之外声明一个List ,并在循环中,在实例化worker之后,将它添加到列表中.然后,如果您需要取消它们,请遍历列表并通过最适合您的方案的方式取消每个列表.

3> Thies..:

我会研究排队需要完成的任务.您将获得以下优势;

您不必处理由于已经运行的其他内容而无法启动后台任务的问题

通过创建为每个任务工作的新背景,您不必担心使用太多线程.

最后,队列可以允许您确保后台任务的运行顺序与创建/请求的顺序相同.

以下是一个示例实现:http://thevalerios.net/matt/2008/05/a-queued-backgroundworker.我不确定是否在线程安全中实现,一旦我弄清楚我正在使用的实现中的当前锁定问题,我将更新我的答案.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有