【问题标题】:Progress Bar and Background Worker进度条和后台工作者
【发布时间】:2015-02-18 09:04:08
【问题描述】:

我在 VB.Net 中有一个进度条和 backgroundworker,我希望以不同的形式工作,如下所示:

Form1()
{
MaxRows = 10
for i = 0 to MaxRows then
// Update my value on the progressbar
....

next
}

ProgressBarForm

Private Sub ProgressBarForm_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        TransferProgressBar.Visible = True
        ProgressBarBackgroundWorker.RunWorkerAsync()
    End Sub

    Private Sub ProgressBarBackgroundWorker_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles ProgressBarBackgroundWorker.DoWork
        For i = 0 To TransferProgressBar.Maximum
            'Dim Percentage As Integer = Math.Round(((i / (TransferProgressBar.Maximum - TransferProgressBar.Minimum)) * 100))
            ProgressBarBackgroundWorker.ReportProgress(i / 100)
        Next

    End Sub

    Private Sub ProgressBarBackgroundWorker_ProgressChanged(sender As Object, e As ComponentModel.ProgressChangedEventArgs) Handles ProgressBarBackgroundWorker.ProgressChanged
        TransferProgressBar.Value = e.ProgressPercentage
        PercentageLabel.Text = "Processing....." & TransferProgressBar.Value.ToString() & "%"
    End Sub

    Private Sub ProgressBarBackgroundWorker_RunWorkerCompleted(sender As Object, e As ComponentModel.RunWorkerCompletedEventArgs) Handles ProgressBarBackgroundWorker.RunWorkerCompleted
        MsgBox("Task Completed!")
        Me.Close()
    End Sub

如何使用来自另一个表单/Sub 的后台工作人员更新我的进度条值?请告诉我。我在这里有点困惑。

【问题讨论】:

标签: vb.net progress-bar backgroundworker


【解决方案1】:

你似乎把它放在了前面。而不是BackgroundWorker 处理ProgressBar 更新,而是使用BGW 来完成耗时的工作。然后,您可以每隔一段时间使用内置的ReportProgress 方法为 ProgressBar/Form 提供更新。

通常,您不能(直接)从创建它的线程(即 UI 线程)以外的线程访问 UI 控件,例如 ProgressBar。 ReportProgress 事件在原始/UI 线程上引发,以简化基本进度报告。

但是,它几乎仅限于此。要执行更多操作,例如将长流程的结果发布到ListBox,您将使用委托来更新其他/UI 线程上的控件。

长时间运行任务的表单

Private WithEvents bgw As New BackgroundWorker
Private frmProg As ProgForm          ' progress bar form

' start up
Private Sub Button1_Click(sender ...etc
    ' set up 
    bgw.WorkerReportsProgress = True
    bgw.WorkerSupportsCancellation = True

    If frmProg Is Nothing Then          ' make sure progress form is instanced
        ProgForm = New frmProg
    End If
        
    If bgw.IsBusy = False Then
        frmProg.Show()
        bgw.RunWorkerAsync(10)         ' do some important work x10
    End If

End Sub

' the job that will take a while
Private Sub bgw_DoWork(sender As Object, e As DoWorkEventArgs) 
                  Handles bgw.DoWork
    ' ToDo: with multiple workers use sender, not 'bgw'
    ' get the amount of work to do
    Dim numToDo As Integer = CInt(e.Argument)

    ' important, time consuming work done here
    For n As Integer = 1 To numToDo
        ' do the "work"
        System.Threading.Thread.Sleep(100)

        ' post a notice, passing the percentage (raises the ProgressChanged event)
        bgw.ReportProgress(Convert.ToInt32((n / numToDo) * 100)  
    Next
End Sub

' event raised from DoWork via ReportProgress
Private Sub bgw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) 
      Handles bgw.ProgressChanged
    ' method added on the Progress form to 

    ' receive percentage and update the meter:
    frmProg.UpdateProgress(e.ProgressPercentage)

    ' if the progress bar was on the same form,
    ' update it directly:
    'MyProgBar.Value = MyProgBar.Maximum
    'MyProgBar.Value = pct
End Sub

' optional event raised when the long running task is complete
Private Sub bgw_RunWorkerCompleted(sender As Object, 
         e As RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted

    ' when all done, report that too
    MessageBox.Show("Work Complete!")
End Sub

请注意,通常使用 Thread.Sleep 会冻结 UI。这不会在这里发生,因为它是 BackgroundWorker 而不是 UI 线程进入睡眠状态。

带有进度条的表单:

Public Sub UpdateProgress(pct As Integer)

   ' ToDo: Add error checking 
    progress.Value = progress.Maximum
    progress.Value = pct
End Sub

【讨论】:

  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2011-05-18
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多