0

我很困惑。是的,我知道我不能使用同一个后台工作人员同时执行两项任务。我不明白的是这个。这是我的代码(所有这些都是设置进度条的 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“仍在工作”。一定有一些我不知道的简单的事情。

谢谢

4

1 回答 1

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、线程或计时器。只需在慢动作之前/之后改变速度。

于 2012-12-16T18:16:43.787 回答