Sei sulla pagina 1di 5

Mostrar progresos con

BackgroundWorker
mayo 11, 2008 de acollado en Piensa en asncrono.
Cuando necesitamos realizar tareas de manera asncrona El .Net Framework nos
proporciona varias opciones;
-Mediante la clase Thread.
-Mediante delegados asncronos.
-Mediante el componente BackgroundWorker.
Se me ocurren diversas situaciones en la que cada uno puede ser ms apropiado. Pero, si
lo que queremos es mostrar el progreso de la tarea, la mejor opcin es el componente
BackgroundWorker. El componente BackgroundWorker tiene varias caractersticas que
le hacen interesante; como puede ser la notificacin del progreso y notificacin de
cancelacin.
El ejemplo de cdigo siguiente es un modo sencillo de dar soporte para cancelacin y
notificacin del progreso de una tarea asncrona.
Nota:
Este componente solo est disponible desde la versin 2.0 del Framework.
Lo primero es arrastrar el componente a nuestra aplicacin

Una vez que los hemos situado en el rea de trabajo configuramos las siguientes
propiedades:
WorkerReportsProgress = true
WorkerSupportsCancellation=true (solo en caso de querer dar soporte para cancelacin)
Ahora definimos los eventos de cancelacin, notificacin y trabajo.
DoWork: Este evento es disparado al comienzo de la operacin asncrona y sera donde
realicemos las tareas.
ProgressChanged: Este evento ser disparado el notificar un progreso al componente.
RunWorkerCompleted: Este evento ser disparado al terminar la operacin asncrona.
Ya podemos escribir el cdigo que sera lanzado con cada evento.
C#
private void bwProgress_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
//Realiza una tarea
System.Threading.Thread.Sleep(100);
bwProgress.ReportProgress(i);
if (bwProgress.CancellationPending)
return;
}
}
private void bwProgress_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//Notificar el progreso de la tarea
progressBar1.Value = e.ProgressPercentage;
lblInfo.Text = e.ProgressPercentage + %;
}
private void bwProgress_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Realizamos las operaciones que haya que realizar al terminar el progreso
Nota:
Si desea acceder a un control desde la operacin que este realizando el componente
BackgroundWorker. Por ejemplo, mostrar el estado de progreso en un control Label, es
ms que aconsejable hacerlo desde el evento ProgressChanged, ya que la aplicacin
podria comportarse de forma inesperada.
lblInfo.Text = Tarea terminada;
btnCancelar.Enabled = false;
btnIniciar.Enabled = true;
progressBar1.Value = 0;
}
private void btnIniciar_Click(object sender, EventArgs e)
{
//Iniciamos el trabajo
if (!bwProgress.IsBusy)
{
bwProgress.RunWorkerAsync();
btnCancelar.Enabled = true;
btnIniciar.Enabled = false;
}
}
private void btnCancelar_Click(object sender, EventArgs e)
{
//Solicitamos la cancelacin de la operacin
bwProgress.CancelAsync();
}
VB
Private Sub bwProgress_DoWork(ByVal sender As System.Object, ByVal e As
System.ComponentModel.DoWorkEventArgs) Handles bwProgress.DoWork
For i As Integer = 1 To 100
Realiza una tarea
System.Threading.Thread.Sleep(100)
bwProgress.ReportProgress(i)
If (bwProgress.CancellationPending) Then
Return
End If
Next
End Sub
Private Sub bwProgress_ProgressChanged(ByVal sender As System.Object, ByVal e As
System.ComponentModel.ProgressChangedEventArgs) Handles bwProgress.ProgressChanged
Notificar el progreso de la tarea
progressBar1.Value = e.ProgressPercentage
lblInfo.Text = e.ProgressPercentage + %
End Sub
Private Sub bwProgress_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As
System.ComponentModel.RunWorkerCompletedEventArgs) Handles bwProgress.RunWorkerCompleted
Realizamos las operaciones que haya que realizar al terminar el progreso
lblInfo.Text = Tarea terminada
btnCancelar.Enabled = False
btnIniciar.Enabled = True
progressBar1.Value = 0
End Sub
Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
btnIniciar.Click
Iniciamos el trabajo
If (Not bwProgress.IsBusy) Then
bwProgress.RunWorkerAsync()
btnCancelar.Enabled = True
btnIniciar.Enabled = False
End If
End Sub
Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
btnCancelar.Click
Solicitamos la cancelacin de la operacin
bwProgress.CancelAsync()
End Sub

Como hemos podido ver, el cdigo es sencillo. Con unas pocas lineas podremos dar
soporte estable a nuestras operaciones asncronas.

Potrebbero piacerti anche