martes, 11 de septiembre de 2007

Usando el MethodInvoker en Compact framework.

La programación con Hilos de ejecución en C# es algo muy sencillo, Gracias a la arquitectura de delegados y eventos definidos por el .net framework!

Alguna vez leí que los hilos deberían ser usados para cualquier proceso que tarde mucho o mas de lo normal, tampoco hay que abusar!

El caso es que los hilos, nos ayudan a tener separado lo que se esta ejecutando y lo que estamos viendo así no tenemos que esperar a que nuestro programa responda para ver los resultados, o simplemente mover la ventana!

Para los que hemos desarrollado aplicaciones Windows con el .net framework 1 que trabajaban con Hilos nos toco hacer muchas maravillas, y trucos muchas veces sucios además de definir un sinfín de delegados y suscriptores a eventos!

Cuando vimos el .net Framework 2.0 y vimos el BackgroundWorker nos aliviamos por muchas cosas, ya no teníamos que escribir tanto código repetido!

Aunque igual tenemos que controlar el acceso a objetos creados en otros hilos!

Y para eso hay dos maneras

La Complicada!

  • Crear un método que ejecutara lo que necesitábamos
  • Crear un delegado para nuestro método
  • Luego crear una instancia del delegado y pasarlo al método Invoke del Formulario o cualquier otro control

La Sencilla

  • Llamar al método Invoke con un método anónimo usando la clase MethodInvoker y listo!

Esto en una aplicación Windows, Muy sencillo Cierto!

¿Pero que pasa cuando queremos usar el MethodInvoker con el compact framework?

Googleando un poco me encontré con mi amiga la MSDN y la documentación de esta clase!
Y como vemos dice muy claro en la especificación de las plataformas! Que funciona para el NetCf, Pero es muy diferente cuando intentamos usarlo, ya que no se encuentra definido en el namespace en el que debería estar!

Así que no nos funciona así como así!

Y eh aquí la razón de Este Post

Para poder usar el MethodInvoker Asi como lo usamos en el Framework para desktop solo necesitamos hacer una cosa!

Reescribir la declaración del MethodInvoker

private delegate void MethodInvoker();//Re-Declaracion!

//Y lo usanos asi como asi
Invoke((MethodInvoker)delegate { this.Visible = true; }};

y luego usarla como si estuvieras en Dektop!

Sencillo no, no entiendo porque escribí tanto antes de Votar el Codigo!

Aquí unas referencias!
http://msdn2.microsoft.com/es-es/library/system.windows.forms.methodinvoker(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
http://www.eggheadcafe.com/software/aspnet/29408147/trying-to-use-anonymous-m.aspx

Que la Fuerza los Acompañe!

2 comentarios:

atikatak dijo...

Hola!

La verdad es que no sé cómo empezar... Ante todo debo agradecerte inconmensurablemente este artículo, ya que con él he visto la luz!! Llevo más de una semana leyendo y leyendo y leyendo webs y blogs buscando esta solución para mi aplicación (que no es simple que digamos)... y aquí, un Viernes 5 de septiembre a las 22:48 de la noche te he encontrado y con tu simple ejemplo y tu simple y clara explicación he podido ver la luz... Vamos, que sepas que hasta me puse a llorar!! jajaja!

Muchas, muchas, muchas gracias, de verdad.

Daniel

Francesc dijo...

Hola Steven,
Me parece interesante el articulo, de hecho yo tengo un problema similar pero en VB, te importaria poner el ejemplo en VB para que pueda probarlo. Muchas gracias

Francesc