Este es más un apunte que un gran conocimiento, pero puede ayudar a más de uno, la idea es mostrar datos en la
UI desde un hilo diferente del principal, por ejemplo: creamos un hilo que se encargue de ir a buscar datos a la
BDD y los muestre en una grilla cuando los reciba.
Cuando aprendí a usart
Invoke lo que hacía era un método que mostraba los datos en la
UI y otro que chequeaba si era necesario utilizar
Invoke o no.
Public Sub MostrarDatos(Datos as DataSet)
If Me.InvokeRequired = True Then
Me.Invoke(New SetDataSource_Delegate(AddressOf SetDataSource), Datos)
Else
Me.SetDataSource(Datos)
End If
End Sub
Private Delegate Sub SetDataSource_Delegate(ds As DataSet)
Private Sub SetDataSource(ds As DataSet)
Me.DatagridView1.DataSource = ds
Me.DatagridView1.DataMember = ds.Tables(0).TableName
End Sub
Un tiempo después, como parte de mi eterna búsqueda por escribir mejor código, descubrí que podía simplificar todo eso usando una llamada recursiva y combinando ambos procedimientos en uno solo de la siguiente manera:
Private Delegate Sub MostrarDatos_Delegate(ds As DataSet)
Public Sub MostrarDatos(Datos as DataSet)
If Me.InvokeRequired = True Then
Me.Invoke(New MostrarDatos_Delegate(AddressOf MostrarDatos), Datos)
Else
Me.DatagridView1.DataSource = ds
Me.DatagridView1.DataMember = ds.Tables(0).TableName
End If
End Sub
Como se puede ver, el código queda más legible y no deja de ser eficiente, además de ahorrarnos un par de líneas... que en un formulario muy extenso puede ayudarnos bastante.