Usando el ProgressBar con un BackGroundWorker

Este ejemplo esta especialmente publicado para Emilio Velardiez que me pregunto como usar una barra de progreso con una BackgroundWorker.

Este ejemplo lo haré en una aplicación Windows Form.

A nuestra aplicación Windows Forms vamos a agregar un BackgroundWorker, llamado BackgroundWorker1, y un ProgressBar, llamado ProgressBar1.

Las únicas propiedades que cambiaremos son las del BackgroundWorker1, para que pueda reportar el proceso:

Y este es el código de nuestra aplicación:

Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load BackgroundWorker1.RunWorkerAsync() End Sub Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Dim i As Integer For i = 1 To 1000 BackgroundWorker1.ReportProgress(i / 10) Threading.Thread.Sleep(500) Next End Sub Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged ProgressBar1.Value = e.ProgressPercentage End Sub Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted MsgBox("listo") End Sub End Class

Espero, como siempre, que os sea útil.

23 thoughts on “Usando el ProgressBar con un BackGroundWorker

  1. Holas Eugenio,

    En primer lugar gracias por el interes que le has puesto al asunto!!! Da gusto ver a personas que disgrutan tanto con el desarrollo. Por lo menos uno no se siente tan solo delante de una pantallita y un teclado. Bueno me costo inserta la funcionalidad en mi aplicación pero al final lo consegui! Publico el codigo que finalmente creo que me esta funcinando correctamente:

    Public Sub InicioProceso()
    _Contador = ProgresoBar.Minimum
    ProcesoLabel.Text = «Iniciando…»
    Me.Cursor = Cursors.WaitCursor
    HiloBackgroundWorker.WorkerSupportsCancellation = True
    HiloBackgroundWorker.WorkerReportsProgress = True
    HiloBackgroundWorker.RunWorkerAsync()
    End Sub

    Public Sub FinProceso()
    HiloBackgroundWorker.CancelAsync()
    End Sub

    Private Sub HiloBackgroundWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles HiloBackgroundWorker.DoWork
    While Not HiloBackgroundWorker.CancellationPending
    If Not HiloBackgroundWorker.CancellationPending Then
    If _Contador = Me.ProgresoBar.Maximum Then _Contador = ProgresoBar.Minimum Else _Contador += 1
    Threading.Thread.Sleep(100)
    HiloBackgroundWorker.ReportProgress(_Contador, «Guardando…»)
    Else
    e.Cancel = True
    Exit While
    End If
    End While

    End Sub

    Private Sub HiloBackgroundWorker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles HiloBackgroundWorker.ProgressChanged
    ProgresoBar.Value = e.ProgressPercentage
    ProcesoLabel.Text = e.UserState
    End Sub

    Private Sub HiloBackgroundWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles HiloBackgroundWorker.RunWorkerCompleted
    If Not (e.Error Is Nothing) Then
    ‘ There was an error during the operation.
    Dim msg As String = String.Format(«Error: {0}», e.Error.Message)
    MessageBox.Show(msg)
    Else
    ‘ The operation completed normally.
    ProgresoBar.Value = ProgresoBar.Minimum
    ProcesoLabel.Text = «Guardado»
    End If
    Me.Cursor = Cursors.Default
    ProgresoBar.Value = ProgresoBar.Maximum
    End Sub

    PD: Para probar el codigo bastaria con llamar a InicioProceso y otro boton para finalizarlo llamando a FinProseso. O tambien podemos probarlo con unico boton que llama a los procedimientos citados pero insertando entre ambos un bucle For de 0 hasta 10000 para observar como se llena la barra de progreso.

    Saludos!!!

  2. Hola, quiciera saber como puedo usar un progressBar para indicar que se está cargando una base de datos…

    La verdad que no tengo ni idea… estoy hace rato buscando información pero no encuentro en ningún lado…

    Saludos.

  3. dispongo del visual basic 6

    No consigo que pase la siguiente expresion:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    El editor me da error al cerrar el parentesis.

    Porque?

  4. Como puedo usar una progress bar para mostrar el proceso de conexion a una base de datos utilizo c#.net pero cualquier solucion es buena jejeje gracias

  5. Hola, e de decir q me a servido de mucha ayuda lo publicado aquí, quisiera pedirte un favor, ya q en la actualidad estoy haciendo un desarrollo, he tenido inconvenientes en q trabaje simultáneamente ProgresoBar y me cargue una base de datos.

    te agradezco si me brindaras cualquier ayuda.

  6. yo ando en las mismas con el progressbar para consultar una base de datos, pero por ahi vi que dicen que manden los comentarios a un correo en especila, es mejor que los publiquen para que todos podamos ver la solucion o poder seguir aportando ideas

    gracias

  7. Tengo una aplicación que me debe procesar unos 100000 registros y necesito colocarle una bara de progreso, estoy utilizando visual 2005( c#, windows form). El caso es el siguiente tengo una pantalla con un boton y un criterio de consulta, cuando yo presiono procesar este llama a un stored procedure de la base que va hacer todo el trabajo, no utilizo ningun for por lo que no se com o hacer la barra de progreso, he revisado y para este caso quiero hacer una barra que llegue al fin y regrese a 0 hasta q el proceso termine. El problema es que no se como ejecutar en paralelo. Ayundenme por favor

  8. Hola, reciban todos primero que todo un saludo. He leido como todos ustedes los anteriores post pero personalmente no me han servido para resolver mi problema, el cual he intentado solucionarlo con algunas de las soluciones que plantean aca pero sin ningun resultado. mi caso especial es tengo una aplicacion winform en C# que se comunica con un Servicio Web que envia correos electronicos, este SW lo desarrolle en asp.net y lo tengo alojado en mi maquina para hacer las pruebas. lo que me gustaria es saber si alguien tiene alguna idea de como mostrar en un ProgressBar el estado del envio del correo o en su defecto como mostrar al usuario mediante un ProgressBque que un SW (puede un SW de cualquier tipo) esta en pleno proceso.

    De antemano muchas gracias…

  9. El articulo sobre Usar el ProgressBar con un BackGroundWorker me a sido de beneficio ya que solo manejaba el ProgressBar con un timer……..muchas gracias…..

  10. Hola, una pregunta: como puedo trabajar un sql query con un Background Worker? intente colocar un sql query en la linea » Threading.Thread.Sleep(500)», pero no funciona, que podria hacer para que funcionara?

  11. Primero que todo, Hola a todos!!
    Me parece interesante lo publicado aquí, pero megustaría saber como aplicar esto en paralelo con un proceso que carga una base de datos y luego manda a imprimir unos reportes de Crystal.

  12. Señor, en cuanto a este tema hay un «latest version» de su artículo pues ha habido muchos comentarios.

    Me interesa, a parte de poder lanzar un proceso lento en segundo plano, poder evitar los parpadeos (o refrescos) del formulario, supongo que todo está relacionado.

    Muchas gracias.

Responder a ilion Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *