DevelopersDotNet.com

Contenido original para la comunidad de desarrolladores Microsoft

BackgroundWorker - Llamadas asíncronas en Windows Forms

Hola a todos, alguien por ahí me pidió el escribir sobre este nuevo amigo que tenemos en Visual Studio 2005, el BackgroundWorker, así que, aquí está:

Como todos sabemos, en VB .Net se introdujo el concepto de hilos de ejecución, con esto, podemos crear Threads sobre los cuales se ejecuten tareas en paralelo. Con Visual Studio .Net 2005 tenemos ahora un nuevo control, llamado el BackgroundWorker que tiene como objetivo el realizar llamadas asíncronas con un modelo mucho mejor diseñado para el fin que hemos mencionado, realizar llamadas asíncronas.

El objeto BackgroundWorker

Como ya se imaginan, este amigo es el que tiene las funcionalidad de hacer las llamadas asíncronas desde una aplicación WinForm. En la siguiente imagen, trato de describir las principales características de este objeto:

Caracteristicas Backgroundworker

El Ejemplo

Pantalla

1.       Creo una pantalla como la anterior, en donde, el DataGridView de la parte superior obtendrá datos de una base de datos y se simulará que el proceso tarda en regresar el resultado.

2.       Como ya se imaginarán, el botón disparará el método de recuperación de datos hacia el Grid, de entrada la imagen y etiqueta que indican "Procesando Petición" se encuentran NO visibles y la barra de progreso en la parte inferior está vacía.

3.       El código es como sigue:

a.       El método que invoca la llamada asíncrona

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

        Me.BackgroundWorker1.RunWorkerAsync()

        Me.PictureBox1.Visible = True

        Me.Label1.Visible = True

    End Sub

En este caso, es el método RunWorkerAsync() del BackgroundWorker

b.      El método asíncrono invocado

    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, _

    ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

 

Dim strCn As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Instructores.mdf;Integrated Security=True;User Instance=True"

        Dim cnSQL As New SqlClient.SqlConnection(strCn)

        cnSQL.Open()

 

        Me.BackgroundWorker1.ReportProgress(50)

        System.Threading.Thread.Sleep(2000) ‘ Para simular tiempo de espera

 

Dim adp As New SqlClient.SqlDataAdapter("Select * From Instructores", cnSQL)

        Dim dsTemp As New DataSet

        adp.Fill(dsTemp, "Instructores")

        Me.BackgroundWorker1.ReportProgress(100)

        e.Result = dsTemp

 

    End Sub

En este método, nos conectamos a una base de datos y obtengo un dataset. Es de suma importancia hacer la siguientes observaciones:

                                                               i.      La invocación del método ReportProgress sirve para indicarle al BackGroundProgress que ha habido un avance en el progreso de la ejecución. En este caso, yo preferí mandarlo directamente (50 y 100). Ustedes pueden hacer un loop en donde este ReportProgress se vaya invocando varias veces y vayan mandando el valor de manera que se autoincremente en el ciclo de manera automática.

                                                             ii.      La última línea de este método, e.Result =  dsTemp sirve para indicar si este método tiene un resultado, TENGO que regresarlo por medio de e.Result, en este caso, es el DataSet que se pegará al DataView.

c.       El evento ProgressChanged

      Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, _

    ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged

 

            Me.ProgressBar1.Value = e.ProgressPercentage

 

Que en este caso, sirve para indicarle a la barra de progreso el valor reportado por el método ReportProgress. Aquí se recibe el par de cambios al avance, el 50 y 100 que se los pego a la barra de progreso.

d.      Para finalizar, el evento RunWorkerCompleted

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As _

Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

        Me.DataGridView1.DataSource = CType(e.Result, DataSet)

        Me.DataGridView1.DataMember = "Instructores"

        MsgBox("Metodo Terminado")

        Me.PictureBox1.Visible = False

        Me.Label1.Visible = False

    End Sub

El evento RunWorkerCompleted, se dispara automáticamente cuando el evento DoWork termina, este evento sirve para cachar el resultado enviado en el e.Result del evento DoWork, aquí es evidente que lo recibimos en e.Result y lo convertimos a un dataset que pueda ser leído por el DataViewGrid.

Si prueban el ejemplo, se darán cuenta que mientras el método de obtención de datos está en ejecución, ustedes pueden seguir utilizando la aplicación sin que esta se bloquee por la llamada a la recuperación de datos.

Conclusión

En Visual Studio 2005 cuento con un nuevo objeto, el BackgroundWorker que sirve para realizar llamadas asíncronas siguiendo un patrón de diseño fácil de entender y utilizar. Ahora es más fácil poder crear aplicaciones de escritorio con menos tiempo de bloqueo hacia mis usuarios.

 


Enviado 04-02-2007 1:44 PM por gmorales
Archivado en:

Comentarios

enriquede escrito re: BackgroundWorker - Llamadas asíncronas en Windows Forms
en 04-13-2007 3:00 PM

Hola Guillermo

muy buen post lo he implementado tambien en C# y funciona excelente por otra parte los Felicito ya hacia falta una comunidad en México

gracias

gmorales escrito re: BackgroundWorker - Llamadas asíncronas en Windows Forms
en 04-16-2007 7:27 PM

Mil Gracias enriquede, esperamos seguir creciendo con las preguntas y aportaciones de todos ustedes.

:-)

pensador escrito re: BackgroundWorker - Llamadas asíncronas en Windows Forms
en 01-19-2009 1:34 PM

Hola a todos.

soy novato en c# y quisiera aprendre a trabajar con el backgroundworker.

tengo 2 formularios. form1 y form2

en el form1 al hacer la consulta a la base de datos el cual me retorna un valor true ò false.

como puedo usar este valor en el form2. el form2 es modal

gracias

Buy soma online order soma and get cheap soma. escrito Buy domain onlinevcvpl soma.
en 06-15-2009 6:24 PM

Buy soma cod. Soma soma buy soma soma online. Buy soma online. Buy soma cheap. Buy domain onlinevcvpl soma. Http pills.viptemplates.com p buy soma. Cyclobenzaprine buy prescription soma zanaflex.

Ofrecido por Community Server (Non-Commercial Edition)