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