我以前见过这个问题,但我没有看到适用于我的具体案例的问题的答案。我有一个以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并处理字符串。
答案 0 :(得分:2)
这可能与您在ToolStripProgressBar1
的{{1}}方法中设置用户界面对象(BackgroundWorker
)的值有关。自己的线程,与DoWork
所在的用户界面线程分开。
根据关于this MSDN page的说明:
您必须小心不要操纵任何用户界面对象 你的DoWork事件处理程序。而是与用户界面进行通信 通过ProgressChanged和RunWorkerCompleted事件。
BackgroundWorker事件不是跨AppDomain边界编组的。 不要使用BackgroundWorker组件来执行多线程 在多个AppDomain中进行操作。
您应该做的是更改循环内部的代码(ToolStripProgressBar1
),这样您就可以调用{{1}而不是直接设置For z As Integer = ints To inte
和Value
属性。 }的ReportProgress
方法。这会引发ProgressChanged
事件,然后您可以在主UI线程上处理该事件。在这里,您可以安全地访问用户界面组件和对象的属性。