【问题标题】:BackGroundWorker not recognizing completion of DoWorkBackGroundWorker 无法识别 DoWork 的完成
【发布时间】:2011-05-19 16:49:54
【问题描述】:

我有一个程序,我想在其中将多个任务按顺序传递给 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,则不会为 case i==0 执行 RunWorkerCompleted 事件,无论我在循环中放置了等待还是延迟。

【问题讨论】:

  • 请出示您的代码。任何一个 BackgroundWorker 只意味着完成一次。如果您正在等待额外的任务,那么您还没有真正完成。
  • 我将循环移到 BackgroundWorker 中,一切正常执行,但现在将我想要的用户消息放在表单上以让用户了解进度会更加复杂。

标签: .net backgroundworker


【解决方案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? 找到更多信息。当然,这样你会失去多线程特性。

【讨论】:

  • 链接上的此信息似乎涵盖了基础。谢谢。
猜你喜欢
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 2021-07-13
  • 2013-07-29
  • 2021-01-03
相关资源
最近更新 更多