Barra di avanzamento e lavoratore in background

Ho una barra di avanzamento e un backgroundworker in VB.Net che vorrei lavorare in un formato diverso come indicato di seguito:

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 

Come posso aggiornare il mio valore di barra di avanzamento usando il backgroundworker da un altro modulo / Sub? Gentilmente fammi sapere. Mi sto un po ‘confuso qui.

Sembri averlo di nuovo in testa. Piuttosto che il BackgroundWorker gestisce gli aggiornamenti di ProgressBar , usa il BGW per fare il lavoro che richiede tempo. Quindi a intervalli è ansible fornire aggiornamenti per ProgressBar / Form utilizzando il metodo ReportProgress .

Normalmente, non puoi (direttamente) accedere ai controlli dell’interfaccia utente, come una ProgressBar , da un thread diverso da quello su cui è stato creato (cioè il thread dell’interfaccia utente). L’evento ReportProgress viene generato sul thread originale / dell’interfaccia utente per semplificare il reporting di avanzamento di base.

Tuttavia, è praticamente limitato a solo quello. Per fare di più, ad esempio postare i risultati del processo lungo su un ListBox , si utilizzerà un Delegato per aggiornare il controllo sull’altro thread / UI.

Il modulo con l’attività di lunga durata

 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 

Si noti che normalmente l’uso di Thread.Sleep blocca l’interfaccia utente. Ciò non accade qui perché è il BackgroundWorker non il thread dell’interfaccia utente che viene messo a dormire.

Il modulo con la barra di avanzamento:

 Public Sub UpdateProgress(pct As Integer) ' ToDo: Add error checking progress.Value = progress.Maximum progress.Value = pct End Sub