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

时间:2012-12-16 18:13:00

标签: vb.net winforms backgroundworker

我很困惑。是的,我知道我不能使用相同的背景工作者同时完成两个任务。我不明白的是这个。这是我的代码(所有这一切都设置了进度条的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没有完成。我知道这很简单,但我不明白,这就是我在这里的所有内容。

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

由于

1 个答案:

答案 0 :(得分: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,线程或计时器。只需在慢动作之前/之后改变速度。