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:

El Ejemplo

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