16 ene 2009

MethodInvoker: un delegado simple integrado en el framework

Muchas veces necesitamos hacer un Invoke, para las veces que necesitamos invocar un método simple, sin parámetros podemos usar el delegado MethodInvoker, que no es más que un Delegate sub sin parámetros:

Public Delegate Sub MethodInvoker()

O sea que si tenemos que utilizarlo podríamos por ejemplo ahcer lo siguiente:

Dim d as MethodInvoker = New MethodInvoker(AddressOf MyProcedimiento)


Simplemente un tip, que me fue útil, ya que hasta que lo encontré declaraba mi propio delegate.

14 ene 2009

101 Ejemplos de LINQ en VB.Net

Un muy buen recurso para aprender a dominar esta gran tecnología, tiene ejemplos de LINQ para SQL, Dataset, XML y Objetos, todos con código fácil de comprender.

Sin duda es un enlace que vale la pena tener a mano.



Enlace: http://msdn.microsoft.com/es-es/vbasic/bb688088(en-us).aspx

5 ene 2009

Recursividad + Invoke = Procedimiento Thread Safe

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.