Recorrer una estructura en arbol con múltiples hilos

by Valeriano Tortola 13. octubre 2007 08:34

Una estructura arbol se recorre por medio de una función recursiva empezando desde el nodo raiz por medio de dos operaciones básicas, un método ProcessNode con el que procesamos la información de ese nodo, y otro GetNodeChilds con el que obtenemos los nodos hijos de un nodo, sería algo así:

static void BrowseTree(Node root)
{
  ProcessNode(root);
  foreach (Node n in GetNodeChilds(root))
  {
    BrowseTree(n);
  }
}

Pero cuando esa estructura en arbol es realmente grande, ó alguna de las dos operaciones conlleva una latencia significativa, como puede ser por ejemplo procesar cada nodo localmente u obtener los hijos de un nodo a través de la red, puede ser muy útil recorrer dicha estructura con múltiples hilos si se dan las condiciones adecuadas, que pueden ser:

Mas...

Tags: , , ,

.NET 2.0 | C# 2.0

Cliente FTP asíncrono

by Valeriano Tortola 7. octubre 2007 11:33

Este es un (largo) ejemplo de como crear un cliente FTP asíncrono que gestione múltiples descargas de forma paralela. En este modelo, generalmente la lógica de la aplicación suele estar compuesta por métodos estáticos, pero se añade un objeto de estado (objectState) que realiza el seguimiento de la tarea durante las fases de la aplicación, el estado de la tarea puede notificarse mediante eventos por cambio, temporizados ó devolver el mismo objeto de estado para su seguimiento externo.

En este caso, he optado por devolver el propio objeto de estado pero protegido con una interfaz para que solo determinados miembros puedan ser accesibles y solo para lectura, el final de la tarea se indica con un evento que trae el mismo tipo de objeto. Guardar el objeto de estado y monitorizarlo ó simplemente esperar al evento de fin... queda a la libre elección.

Mas...

Tags: , , , , ,

.NET 2.0 | C# 2.0

Extendiendo un ProgressBar. FlatProgressBar.

by Valeriano Tortola 6. octubre 2007 19:58
FlatProgressBar

Vamos con una de Arts Attack... El ProgressBar de .NET es "bonito", sobre todo en Windows Vista, pero a mi gusto prefería menos destellos fashion y un poco más de información... y ya puestos ... un estilo flat :D 

En vez de crear uno from scratch, mucho mejor extender el ProgressBar, añadirle nuevas propiedades y redefinir como repintarlo. Código fuente al final del artículo ;)

 

Mas...

Tags: ,

.NET 2.0 | C# 2.0 | WinApps

Optimización de la evaluación de condiciones

by Valeriano Tortola 6. octubre 2007 02:51

En C#, el orden de evaluación de operadores es de izquierda a derecha por orden de prioridad en cualquier tipo de operación. Además, a la hora de evaluar condiciones lógicas se puede anticipar el resultado final si el resultado parcial hasta el momento es inamovible, es decir, que pase lo que pase en el resto de condiciones el resultado parcial será el definitivo, en ese caso, el resto de condiciones no son evaluadas.

Desde el punto de vista del rendimiento, nos permite ahorrar evaluaciones (y con ello instrucciones) innecesarias en nuestra lógica si nos aprovechamos bien de esta característica.

Mas...

Tags: ,

.NET 2.0 | C# 2.0

CLR String Interning

by Valeriano Tortola 4. octubre 2007 22:29

Un String, es un tipo de referencia especial llamado inmutable, que quiere decir que el dato almacenado en el heap no se puede cambiar, cuando asignamos un nuevo valor a una variable de este tipo, un nuevo dato es generado en otra posición del heap y su dirección de memoria asignada a dicha variable, el dato anterior queda listo para ser GarbageCollected. Bien, pues este comportamiento que ... a unos les gusta más... a otros menos... se ideó así para evitar condiciones de anticipación en entornos multithreading tanto por motivos de consistencia como de seguridad, y tiene la evidente desventaja del engorro de memoria y trabajo extra para el GC que provoca.

El String Interning es una técnica de optimización que aplica el CLR sobre los String, que consiste en que los literales de este tipo de nuestro dominio de aplicación, son almacenados en un HashTable interno, de forma que si dos variables tienen el mismo valor y este ha sido internado, ambas variables apuntan a la misma referencia. Esto es facilmente comprobable con este simple código:

Mas...

Tags: , ,

.NET 2.0 | C# 2.0

Se publicarán las fuentes de la BCL de .NET

by Valeriano Tortola 4. octubre 2007 13:36

Gran noticia que me llega a través del correo de Avanade, Releasing the source code for the .NET Framework Libraries :D

Iran incluidas en la salida de .NET 3.5 y VS2008, aunque es posible que esten disponibles para descarga en breve. Se publican bajo la licencia opensource de Microsoft MS-RL.

Mas...

Tags:

.NET 2.0

Medir la velocidad de un Stream

by Valeriano Tortola 28. septiembre 2007 20:46

Cosilla curiosa que nunca había hecho antes, medir la velocidad de lectura de un Stream, por ejemplo para saber a que velocidad en Bytes/s descargamos de un NetworkStream, ó de un FtpDataStream, ó para saber como de rápido lee nuestro disco duro ... ya sea con fines meramente estadísticos ó para encontrar el tamaño de buffer adecuado ... Es un procedmiento muy sencillo, se trata de dividir los bytes descargados entre los milisegundos transcurridos (cuantos bytes por milisegundo) y multiplicarlo por 1000 (un segundo). Para ello nos apoyamos en la clase para realizar mediciones de tiempo con precisión, StopWatch.

Mas...

Tags: , ,

.NET 2.0 | C# 2.0

DbTransaction, transaciones en un Db Factory

by Valeriano Tortola 16. septiembre 2007 21:08

Siguiendo con el tema del DbFactory con las clases de System.Data.Common, que permiten trabajar con cualquier base de datos de la que tengamos un proveedor en .NET, explicaré la clase DbTransaction, el cual permite realizar transacciones en la base de datos (explicación más completa en la versión en inglés).

Una transacción es una operación formada por un grupo de operaciones relacionadas, cada una podría requerir varias operaciones de lectura y/ó escritura en la base de datos, y solo tiene validez si se ejecutan todas. En caso de producirse un error en el transcurso de la transacción, ha de ser posible “deshacer” todas las operaciones anteriores (rollback), en caso contrario se da por finalizada la transacción aplicando los cambios (commit).

Mas...

Tags:

.NET 2.0 | C# 2.0 | ADO.NET

DbParameter.

by Valeriano Tortola 16. septiembre 2007 20:56

Para evitar problemas de seguridad en ADO.NET 2.0 es recomendable componer las sentencias SQL a base de parámetros en lugar de construir las cadenas manualmente en base a las propiedades .Text de los controles u otros orígenes. De esta forma evitamos fallos de seguridad potenciales (ie: SQL Injection) y otros problemas menores. Siguiendo con nuestra DB Factory donde mostré como utilizar la Fábrica de objetos de ADO.NET 2.0 para construir objetos que pueden manejar cualquier base de datos, ahora le toca el turno a la clase DbParameter para añadir parámetros a las sentencias SQL de nuestra DB Factory.

Mas...

Tags:

.NET 2.0 | C# 2.0 | ADO.NET

Localizar carpetas especiales de Windows

by Valeriano Tortola 16. septiembre 2007 04:46

Esto lo ví una vez y a raiz de una pregunta en el foro lo busqué de nuevo. Se trata de como localizar las rutas a las carpetas especiales de Windows desde .NET, aunque existe una variable de entorno %homepath% apuntando a nuestra carpeta personal en el sistema, no hay ninguna para llegar a carpetas como 'Escritorio', 'Mis Imágenes', 'Mi Música', ... etc ... y dependiendo del idioma en el que este el sistema operativo, pueden llamarse 'Desktop', 'My Pictures', 'My Music', ...etc...

Mas...

Tags:

.NET 2.0 | C# 2.0