Freigeben über


El BackgroundWorker

Durante el desarrollo de una aplicación para mi equipo, estuve experimentando con el control BackgroundWorker y me pareció muy útil. ¡Así que a compartir!

Para este ejemplo, diseñe una aplicación muy básica.

 

Es una aplicación WinForm con algunos controles (Label, Button, ProgressBar) para demostrar cómo funciona el BackgroundWorker.

Primero, habilito las propiedades de BackgroundWorker WorkerReportsProgress y WorkerSupportsCancellation a True.

A ver los fragmentos de código…

Para iniciar el proceso, presiono el botón “Inicio”

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

BackgroundWorker1.RunWorkerAsync()

If BackgroundWorker1.CancellationPending Then

Exit Sub

End If

End Sub

RunWorkerAsync inicia el proceso DoWork

Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

Dim i As Integer = 0

For i = 0 To 100

BackgroundWorker1.ReportProgress(j)

Next

End Sub

El método CancellationPending esta asociado a la propiedad WorkerSupportsCancellation, que cuando en True, habilita el evento de cancelación. En este ejemplo, ocurre cuando presiono el botón “Cancelar”.

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

BackgroundWorker1.CancelAsync()

Label1.Text = "Proceso cancelado"

MsgBox(ProgressBar1.Value)

End Sub

¿Se acuerdan de la propiedad WorkerReportsProgress? Con este evento puede actualizar la IU de la aplicación. Por ejemplo, actualizar el valor del control ProgressBar.

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged

ProgressBar1.Value = e.ProgressPercentage

End Sub

Finalmente, utilizo el evento RunWorkerCompleted que me avisa cuando el subproceso ha completado su trabajo.

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

Label1.Text = "Proceso completado"

End Sub