BackGroundWorker无法识别DoWork的完成情况

时间:2011-05-19 16:49:55

标签: .net backgroundworker

我有一个程序,我希望按顺序将多个任务传递给BackGroundWorker。我的问题是没有执行RunWorkerCompleted事件并且没有清除IsBusy标志。 ProgressChanged事件确实执行。 DoWork例程中的最终语句确实已执行。我可以完成第一项任务,但不能执行任何后续任务。

任何想法要看什么?

编辑(已添加代码):

这个概念(有点简化)是这样的:

for (int i = 0; i < cnt; i++)
            {
                string sDiv = dlg.GetItem(i).Substring(0, 5);
                bgw8Div.RunWorkerAsync(sDiv);
                // some kind of wait or delay or test needed here
            }

如果cnt == 1,一切都很好。如果cnt> 1,则无论我在循环中放置等待或延迟,都不会对i == 0的情况执行RunWorkerCompleted事件。

1 个答案:

答案 0 :(得分:1)

您必须以编程方式创建BackgroundWorker:

for (int i = 0; i < cnt; i++)
        {
            string sDiv = dlg.GetItem(i).Substring(0, 5);
            var bgw = new BackGroundWorker();
            // some kind of wait or delay or test needed here
            bgw.DoWork += 
            new DoWorkEventHandler(bw_DoWork);
            bgw.ProgressChanged += 
            new ProgressChangedEventHandler(bw_ProgressChanged);
            bgw.RunWorkerCompleted += 
            new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            bgw.RunWorkerAsync(sDiv);
        }  

另一个选择是等到bgw8Div完成。您可以在How to wait for a BackgroundWorker to cancel?找到更多信息。当然,你会以这种方式失去多线程功能。