lunes, 2 de marzo de 2009

Ejecución de funciones de modo asíncrono


¿Tienes en tu programa una función que tarda muchísimo en ejecutarse y no tienes que hacer nada con el resultado de esta? Por ejemplo en servicios de notificaciones a los que no esperas que te confirmen su recepción, escribir en un fichero de Log, insertar en un registro en una tabla, etc. En general acciones que no tienen que ver con la funcionalidad principal que estamos ejecutando en ese momento.
Si te has encontrado en esta situación .. ¡el esperar se va a acabar! Tenemos los Delegate.
Los delegados son básicamente un puntero a un función de tu programa, ¡Tranquilos! No vamos a ver nada de punteros .. no estamos en C. Lo que hace el .NET Framework es ejecutar tu función en otro subproceso de tu aplicación, sin tener que crear Thread.

Por ejemplo, imaginad que tenemos la siguiente función de nuestro programa:


Private Sub FuncionEjecutadaAsincrona(ByVal parametro1 As String)
'Código pesado del cual no esperamos su respuesta
End Sub

Para crear su delegado simplemente tendríamos que definir la así:
Private Delegate Sub FuncionEjecutadaAsincronaDelegate(ByVal parametro1 As String)

Efectivamente como podéis ver simplemente tenéis que utilizar la misma definición del procedimiento añadiendo la palabra Delegate.
Ahora sólo falta llamar a nuestra función que se hará así:

Dim deleg As FuncionEjecutadaAsincronaDelegate
deleg = New FuncionEjecutadaAsincronaDelegate(AddressOf FuncionEjecutadaAsincrona)
deleg.BeginInvoke("Parametro1", Nothing, Nothing)

¡Y ya está! Al realizar la llamada a BeginInvoke se lanza nuestra función. Los dos parámetros a Nothing permiten, si es una función, recibir la información de respuesta pero eso lo veremos otro día.