为什么我的进度条会消失?

时间:2011-08-30 17:22:02

标签: vb.net multithreading progress-bar

我以前见过这个问题,但我没有看到适用于我的具体案例的问题的答案。我有一个以VB形式运行的BackgroundWorker,以及一个进度条和一些标签。我也(如果它很重要)在我的表单上有一个WebBrowser,但它不受该线程的影响。

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    Dim ints As Integer = Int(InputBox("What number to start at?"))
    Dim inte As Integer = Int(InputBox("What number to end at?"))
    ToolStripStatusLabel1.Text = "0 / " & inte - ints
    ToolStripProgressBar1.Maximum = inte
    ToolStripProgressBar1.Minimum = ints
    ToolStripProgressBar1.Style = ProgressBarStyle.Continuous
    Try
        For z As Integer = ints To inte

            ToolStripProgressBar1.Value = z
            ToolStripStatusLabel1.Text = z & "/" & inte
            'do some stuff here
    catch etc
    next

循环运行时,有时会停止并且进度条消失。知道为什么吗? 顺便说一句,我在那里做的唯一事情是运行httpwebrequest并处理字符串。

1 个答案:

答案 0 :(得分:2)

这可能与您在ToolStripProgressBar1的{​​{1}}方法中设置用户界面对象(BackgroundWorker)的值有关。自己的线程,与DoWork所在的用户界面线程分开。

根据关于this MSDN page的说明:

  

您必须小心不要操纵任何用户界面对象   你的DoWork事件处理程序。而是与用户界面进行通信   通过ProgressChanged和RunWorkerCompleted事件。

     

BackgroundWorker事件不是跨AppDomain边界编组的。   不要使用BackgroundWorker组件来执行多线程   在多个AppDomain中进行操作。

您应该做的是更改循环内部的代码(ToolStripProgressBar1),这样您就可以调用{{1}而不是直接设置For z As Integer = ints To inteValue属性。 }的ReportProgress方法。这会引发ProgressChanged事件,然后您可以在主UI线程上处理该事件。在这里,您可以安全地访问用户界面组件和对象的属性。