【问题标题】:This BackgroundWorker is currently busy and cannot run multiple tasks concurrently此 BackgroundWorker 当前正忙,无法同时运行多个任务
【发布时间】:2012-12-17 22:07:45
【问题描述】:

我很困惑。是的,我知道我不能使用同一个后台工作人员同时执行两项任务。我不明白的是这个。这是我的代码(所有这些都是设置进度条的 marqueeanimationspeed...

'THE FOLLOWING SUB TOGGLES THE PROGRESS BAR
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    'CHECK THE STATE OF THE PROGRESS BAR AND TOGGLE IT
    If ToolStripProgressBar1.MarqueeAnimationSpeed = 0 Then

        ToolStripProgressBar1.MarqueeAnimationSpeed = 22

    End If

    ToolStripProgressBar1.MarqueeAnimationSpeed = 0


End Sub

好的,那么这可能需要多长时间?工人不做任务并退出吗?所以我暂停了(system.threading.thread.sleep(2000)...同样的问题,做了20秒...同样的问题。

所以我假设这是我缺少的一个简单的东西,但我花了一个多小时搜索但我没有得到它。

我在这里想要完成的只是在 UI 运行其他内容时启动选取进度条,然后停止它。我假设我可以创建另一个后台工作人员并使用它,但我想了解为什么第一个工作人员没有完成任务。

再次感谢,是的,我花了一个小时搜索,找到了各种“解决方案”,但没有解释为什么这件事没有完成。

好的,这里是调用 BGW 的子

    'THE FOLLOWING SUB FIRES THE SETTING CONNECTION STRINGS SUB
Private Sub SetCSButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SetCSButton.Click

    'START THE PROGRESS BAR & CHANGE THE LABEL
    BackgroundWorker1.RunWorkerAsync()
    Threading.Thread.Sleep(1000)
    ToolStripStatusLabel1.Text = "Preparing the connection strings..."
    Me.Refresh()


    thread3 = New System.Threading.Thread(AddressOf SetConnectionStrings)
    thread3.Start()

    'STOP THE PROGRESS BAR & CHANGE THE LABEL
    BackgroundWorker2.RunWorkerAsync()
    Threading.Thread.Sleep(1000)
    ToolStripStatusLabel1.Text = "Standing by..."
    Me.Refresh()

End Sub**strong text**

我有 20 秒的延迟,但第一个 BGW 仍然没有完成。我知道这很简单,但我不明白,这就是我所追求的。

我确实更改了代码,并且没有使用我在写这个问题时尝试的相同方法......我不明白的是为什么一个简单的操作显然永远不会完成......话虽如此那,它确实完成了,因为我能够使用 runworkercompleted 事件显示一个 msgbox。因此,正如我尝试但未能传达的那样,这不是关于编码方式的正确或错误,我知道这是错误的,只是试图快速而肮脏,不管怎样,我现在不这样做,但我不明白为什么BGW“仍在工作”。一定有一些我不知道的简单的事情。

谢谢

【问题讨论】:

  • 编辑后:不是很清楚,因为现在 Bg2 和 Thread3 开始发挥作用。但是当 Bgw1 和 Bgw2 以某种方式引用同一个实例时,Thread.Sleep() 会占用消息循环,因此无法处理 Completed 事件。

标签: vb.net winforms backgroundworker


【解决方案1】:

错误不在发布的代码中,而是在您启动 Bgw 的位置。

但这一切都无关紧要,因为您不应该触摸 DoWork 的 GUI:

Private Sub BackgroundWorker1_DoWork(...) Handles BackgroundWorker1.DoWork

    'CHECK THE STATE OF THE PROGRESS BAR AND TOGGLE IT
    If ToolStripProgressBar1.MarqueeAnimationSpeed = 0 Then   ' Boom, cross-threading violation

        ToolStripProgressBar1.MarqueeAnimationSpeed = 22

    End If

我认为您在这里不需要 Bgw、线程或计时器。只需在慢动作之前/之后更改速度即可。

【讨论】:

  • 这是一个简单的应用程序,所以我不理会委托,我忽略了跨线程调用......我知道可能不是“正确的”,但我是唯一的开发人员,我不知道其他任何行为它。另外,我的困惑是为什么 bgw 没有完成,它几乎什么也没做。我尝试了延迟等,我认为只是我可以足够快地到达那里,以至于 bgw 真的没有完成,但是在主线程中有 20 秒的延迟,它必须完成对吗?这就是我的困惑。
  • 除非我遗漏了什么,这当然很有可能...想让进度条扫一扫。如果我按照您的建议进行操作,并且我一开始是这样做的,则代码会更新字幕速度,在更新 dgv 时没有任何反应,然后将其关闭,因此用户在进度条上看不到任何反应。也许我在这里感到困惑或做一些更基本的错误?
  • 只使用 Bgw 来做非 GUI 的事情,比如加载数据。在那里设置 Marquee 属性是没有用的。核心/标题问题仍然无法回答,因为您没有发布相关代码。
  • 发布完整代码,因为在您发布的 sn-p 中无法看到错误原因。也就是说,如果您刚刚抑制了交叉线程错误,您可能会遇到许多问题,并且没有任何理由这样做。后台工作人员的设计考虑到了这一点,并具有报告进度属性。
  • 第二次单击“SetSCButton”按钮后是否出现错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多