lunes, 29 de junio de 2009

Object is currently in use elsewhere con C# y aplicaciones GDI

En mi día a día laboral, con nada lidie mas que con analizar y modificar código realizado por otro programador!, tratar de entender que quizo hacer y como lo quizo hacer suele resultar harto dificil! y en algunos casos, inviable.
Pero la idea no es hablar sobre esto, sino sobre un error que me comenzo a aparecer luego de aplicarles mis "cambios mágicos".
Basicamente la aplicación manejaba gran cantidad de imágenes y las iba aplicando ciertos cambios y las iba previsualizando en un picturebox constantemente.
Por esas cosas de la computacion, y en casos muy particulares, la aplicación lanzaba la excepción

Object is currently in use elsewhere

Luego de unos dias de investigación, encontre lo siguiente: La visualización de la imagen se realizaba en el mismo hilo en el que se queria modificar, es decir, en el mismo hilo se queria acceder a un objeto que se encontraba aun en uso.

La solución fue simple, lanzar el proceso de visualización de la imagen en un hilo separado, quedando por un lado el hilo que realiza la modificacion de la imagen y por otro lado, la visualizacion. Código de ejemplo utilizando un BackGroundWorker:

//Creamos el parametro para pasar la imagen
ArrayList parameters = new ArrayList();
//Agregamos la imagen
parameters.Add(LaImagenAmostrar);
//Creamos el hilo en un BackgroundWorker
BackgroundWorker bk = new BackgroundWorker();
//OnShowImage= método que gestiona la tarea principal del backgroundworker
bk.DoWork += new DoWorkEventHandler(OnShowImage);
//Lanzamos el Hilo!
bk.RunWorkerAsync(parameters);


private void OnShowImage(object sender, DoWorkEventArgs e)
{
//Recuperamos los parametros recibidos
ArrayList parameters = e.Argument as ArrayList;
//Casteamos a imagen
Image imgToShow = parameters[0] as Image;
//La mostramos en el pictureBox
previewPictureBox.Image = imgToShow;
}
bk.DoWork += new

Con eso solucione el error de mi aplicacion y ademas, gano en rendimiento, aislando los procesos y optimizando los recursos.

domingo, 28 de junio de 2009

Empezando con Silverlight

Bueno gente, el mundo avanza y las técnologías tambien (no dije nada nuevo!).
Debemos prepararnos para empezar con esta nueva tecnología llamada Silverlight, la cual promete darle un nuevo significado a nuestra experiencia como desarrolladores de aplicaciones webs.

Silverlight es una tecnologia para el desarrollo de RIA (Rich Internet Applications), algo asi como aplicaciones web enriquecidas.
Funciona similar a Flash, con solo instalar un plugin podemos disfrutar de un nuevo modo de presentación de las clásicas páginitas aspx.

Bueno, vamos bajandonos el soft necesario para empezar:

Sitio Principal de SilverLight

C# para Niños!

Si te cuesta aprender a programar en C#, te viste todos los tutoriales y aun asi no sabes como empezar? Microsoft largo un nuevo portal de entrenamiento, esta vez enfocado a los KIDS! Si! la idea es que desde chicos uno se valla interiorizando sobre la técnología .net y la forma de implementarlas.
La idea del curso es enseñarnos las técnicas de programacion con infinidad de imágenes y con ejemplos de código fáciles de entender y practicar.

En en link que te dejo abajo, esta el e-book al que hacia referencia.

C# for Sharp Kids
http://msdn.microsoft.com/en-us/beginner/bb308756.aspx