Neo*_*ile 4 vb.net backgroundworker progress-bar
我在VB.Net中有一个进度条和后台工作程序,我希望以不同的形式工作,如下所示:
Form1()
{
MaxRows = 10
for i = 0 to MaxRows then
// Update my value on the progressbar
....
next
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如何使用其他表单/ Sub中的backgroundworker更新我的进度条值?请告诉我.我在这里有点困惑.
你似乎把它带到了前面.而不是BackgroundWorker
处理ProgressBar
更新,使用BGW进行耗时的工作.然后,您可以定期使用内置ReportProgress
方法为ProgressBar/Form提供更新.
通常,您不能(直接)ProgressBar
从其创建的线程(即UI线程)之外的线程访问UI控件(如a ).该ReportProgress
事件在原始/ UI线程上引发,以使基本进度报告变得容易.
但是,它几乎仅限于此.要执行更多操作,例如将长进程的结果发布到a ListBox
,您将使用Delegate更新其他/ 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
Run Code Online (Sandbox Code Playgroud)
请注意,通常使用Thread.Sleep
冻结UI.这不会发生在这里,因为它BackgroundWorker
不是被放入睡眠的UI线程.
Public Sub UpdateProgress(pct As Integer)
' ToDo: Add error checking
progress.Value = progress.Maximum
progress.Value = pct
End Sub
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15146 次 |
最近记录: |