进度栏和后台工作者 [英] Progress Bar and Background Worker

查看:71
本文介绍了进度栏和后台工作者的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在VB.Net中有一个进度条和后台工作人员,我希望以下面给出的不同形式工作:

I have a progress bar and backgroundworker in VB.Net that I would want to work in a different form as given below:

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更新我的进度栏值?请让我知道.我在这里有点困惑.

How can I update my progressbar value using the backgroundworker from another form/Sub? Kindly let me know. I'm getting a bit confused here.

推荐答案

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

You seem to have it back to front. Rather than the BackgroundWorker handling the ProgressBar updates, use the BGW to do the time consuming work. Then at intervals you can provide updates for the ProgressBar/Form using the built-in ReportProgress method.

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

Normally, you cannot (directly) access UI controls, like a ProgressBar, from a thread other than the one it was created on (ie the UI thread). The ReportProgress event is raised on the original/UI thread to make basic progress reporting easy.

但是,它几乎仅限于此.要执行更多操作,例如将长时间处理的结果发布到ListBox,则可以使用Delegate更新其他/UI线程上的控件.

However, it is pretty much limited to only that. To do more, for instance post results of the long process to a ListBox, you would use a Delegate to update the control on the other/UI thread.

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线程.

Note that normally using Thread.Sleep freezes the UI. That doesnt happen here because it is the BackgroundWorker not the UI thread which is put to sleep.

Public Sub UpdateProgress(pct As Integer)

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

这篇关于进度栏和后台工作者的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆