VB.Net: Tareas asíncronas con BackgroundWorker

BackgroundWorker es una clase que sirve para ejecutar una operación en un subproceso independiente, en otras palabras, se utiliza cuando realizamos procesos costosos o largos que pueden bloquear la interfaz del usuario mientras se ejecutan.

Para añadir un BackgroundWorker a nuestro formulario podemos hacerlo de dos maneras: declarando el componente en el código del form, o la mas simple, arrastrando el componente desde el cuadro de herramientas al form.  Tras añadir el componente añadiremos tres eventos fundamentales a nuestro código, el primero es “DoWork” que se encarga de iniciar la operación (todas las tareas que bloquean la interfaz irán aquí), el segundo “ProgressChanged” que lo llamaremos desde el método DoWork cada vez que queramos informar al usuario de la evolución de la operación (por ejemplo modificando el progreso de una “ProgressBar”) para que funcione debemos especificarle al BackgroundWorker que queremos informar sobre el progreso, y por último el evento “RunWorkerCompleted” que se ejecuta cuando ha terminado la operación asíncrona, en este evento podríamos mostrar un dialogo informando al usuario de que la tarea en segundo plano ha finalizado.

' Indicamos (por ejemplo en el evento Load) que el BackgroundWorker va a informar sobre el progreso 
...
Me.BackgroundWorker.WorkerReportsProgress = True
...


' Evento que realiza la operación asíncrona
Private Sub BackgroundWorker_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork

    For x As Integer = 0 To 100
        Threading.Thread.Sleep(100)  
        Me.BackgroundWorker.ReportProgress(1)
    Next

End Sub

' Evento que actualiza la progressbar para que el usuario vea la evolución de la operación
Private Sub BackgroundWorker_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker.ProgressChanged
 
   Me.ProgressBar1.Value += e.ProgressPercentage

End Sub

' Evento que muestra una alerta para informar al usuario de que la operación asíncrona ha finalizado (ya sea porque el usuario la ha cancelado, se ha producido un erorr, o ha finalizado correctamente)
Private Sub BackgroundWorker_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker.RunWorkerCompleted

    If e.Cancelled Then
        MessageBox.Show("La operación ha sido cancelada.")
    Else If e.Error IsNot Nothing Then
        MessageBox.Show("Se ha producido un error durante la ejecución: " & e.Error.Message)
    Else
        MessageBox.Show("La operación en segundo plano ha finalizado con éxito.")
    End If

End Sub

Si además queremos que la tarea pueda ser cancelada por el usuario, debemos poner un botón que en su evento click llame al método encargado de cancelar la operación. Pero antes hay que indicarle al BackgroundWorker que queremos que pueda ser cancelada.

' Indicamos (por ejemplo en el evento Load) que queremos que el backgroundworker tenga cancelación
Me.BackgroundWorker.WorkerSupportsCancellation = True
' Evento que cancela la tarea asíncrona si estuviera todavía en ejecución
Private Sub btnCancelarTarea_Click(sender As System.Object, e As System.EventArgs) Handles btnCancelartarea.Click

    If Me.BackgroundWorker.WorkersSupportsCancellation = True Then
        Me.btnCancelarTarea.Enabled = False
        Me.BackgroundWorker.CancelAsync()
    End If

End Sub

Finalmente la llamada que iniciará todo el proceso:

' Iniciamos la tarea asíncroma
BackgroundWorker.RunWorkerAsync()
Anuncios

Un comentario en “VB.Net: Tareas asíncronas con BackgroundWorker

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s