Ir al contenido principal

Entradas

Programación asíncrona con async/await en .Net

Introducción A partir de la versión 4.5 de .Net framework se ha simplificado de forma considerable la forma en que podemos trabajar con código asíncrono. Con los anteriores frameworks, si queríamos contar con los beneficios de una programación asíncrona nos veíamos obligados a lidiar con una gran complejidad en nuestro código. Esto nos hacía evitar su uso en lo posible a pesar de perder esta importante característica. Stephen Cleary , un MVP especializado en concurrencia define la programación asíncrona como: Una forma de concurrencia que utiliza futuros o "callbacks" para evitar hilos innecesarios. La programación moderna con async y await nos abstrae de la utilización de "callbacks" y nos permite utilizar futuros (Tasks) que se encargarán de notificar al llamante cuando el método asíncrono se complete. async y await Las palabras async y await son las palabras clave que .Net ha introducido en el lenguaje para que podamos implementar métodos asíncronos co...
Entradas recientes

Inicio de una aplicación ASP.NET Core

Introducción ASP.NET Core es un framework para desarrollar aplicaciones web multiplatarforma , de código abierto y se encuentra disponible en GitHub . El hecho de que sea multiplataforma significa que nuestra aplicación no puede estar acoplada a un servidor concreto . Aparte de que nuestra aplicación sea multiplataforma tendremos otros beneficios adicionales: No necesitamos instalar un Framework .NET para que se ejecute. Todos las bibliotecas necesarias forman parte de nuestra entrega. Puede usarse Visual Studio Code para desarrollar las aplicaciones el cual es libre, ligero y está disponible para todas las platarformas. Es muy ligero en comparación con ASP.NET . Las comparaciones entre ambos frameworks son bastante significativas, tanto en términos de memoria consumida, como de espacio en disco y lo más importante, las peticiones que es capaz de servir por segundo. Desacople servidor-aplicación En un primer paso, ASP.NET introdujo una evolución implementando la espec...

Método Main asíncrono disponible en C# 7.1

Punto de entrada Main En .Net podemos crear programas con o sin un punto de entrada. Si tenemos un punto de entrada, el sistema operativo podrá cargar y ejecutar su código, y si no lo tenemos, el sistema operativo no podrá directamente ejecutar el programa, más bien será otro programa el que referencie nuestro código y sea él quien lo ejecute. En C# definimos nuestro punto de entrada con un método Main declarado dentro de una clase o estructura no estática. Además, el método debe ser estático y no público. El valor devuelto puede ser int o void . De forma opcional se pueden especificar argumentos de entrada en forma de array de strings string[] . Así pues, estas son las posibles firmas que se pueden utilizar: Punto de entrada asíncrono en C# 7.1 Con la aparición de las palabras clave async y await para la creación de métodos asíncronos y su gran adopción por parte de la comunidad, se extiende la forma en que podemos crear nuestro punto de entrada para que sea compatible con e...

Inicialización diferida

Introducción La inicialización o carga diferida (lazy initialization) nos permite posponer la creación de un objeto hasta su primer uso. Esto nos ayuda a aumentar el rendimiento de nuestras aplicaciones cuando tenemos objetos muy pesados que no son necesarios de forma inmediata e incluso puede que no se lleguen a usar nunca. También nos permite mejorar el inicio de un programa priorizando la carga instantánea de los objetos necesarios al inicio y posponiendo la carga de otros objetos pesados después. Una forma muy simple de realizar una inicialización diferida sobre una propiedad es la siguiente: La variable de respaldo _pedidos se mantendrá sin inicializar hasta que accedamos a la propiedad Pedidos por primera vez. En ese momento se creará la instancia llamando al constructor. Las siguientes veces que accedamos a la propiedad obtendremos la misma instancia. El problema que tenemos con este código es que no implementa seguridad en hilos (no es thread safe). Si estamos seguros...

Arboles de expresión y reflexión estática

Arboles de expresión Un árbol de expresión es una expresión lambda sin compilar. Cuando utilizamos un árbol de expresión, el código de la expresión lambda se mantiene en memoria en forma de estructura de árbol binario. Se almacenan las partes de la expresión y las operaciones entre las partes por separado en una estructura de árbol. En este estructura los nodos representan operadores y las hojas representan valores. De esta forma es posible representar cualquier operación como una jerarquía. Veamos un ejemplo de árbol de expresión binario muy simple: En el ejemplo, si partimos de las hojas hacia la raíz nos encontramos primero con los valores 20 y 5 cuyo nodo común es el operador suma, por lo que el operador podría sustituirse por el valor resultado de la suma: 25. A continuación tendríamos dos hojas con los valores 25 y 10 con un nodo común con la operación multiplicar, por lo que el resultado de ambos será de 25 multiplicado por 10: 250. Al ser la raíz del árbol este serí...

Interfaces fluidas

Introducción Martin Fowler definió la técnica Interfaz fluida (Fluent Interface) como un estilo para construir interfaces (APIs) orientadas a objetos que nos permite escribir un código fácilmente leíble . A continuación, mostraré como se implementa esta técnica con el encadenamiento de métodos (Method Chaining) . Después ampliaré el post para ver esta misma técnica con métodos que aceptan como parámetros a delegados ( Actions o Functions ), dando una mayor flexibilidad y expresividad a esta técnica. Son muchos los frameworks que implementan esta técnica y muchos de ellos empleando delegados. Muchos de ellos los utilizamos a diario como consumidores y poco a poco nos hemos acostumbrado a ellos. Ahora veremos como implementarlos nosotros mismos para nuestras propias interfaces. Suelen emplearse para realizar acciones secuenciales sobre un mismo objeto. Tal es el caso de las parametrizaciones y transformaciones de los objetos complejos. Encadenamiento de métodos Esta técnica ...

Composición o herencia: Ser o tener

Introducción El diseño de una solución software basado en objetos requiere que los objetos se relacionen entre sí. Cuando una clase necesita utilizar el código de otra clase necesitamos relacionar estas dos clases. Esta relación la podemos establecer de varias formas y dos de las más importantes en POO son: heredando de una clase base: el objeto adquiere todas las propiedades y comportamientos del objeto base; por composición: conteniendo instancias de otros objetos que implementen esa funcionalidad. Un principio de diseño en POO dice que ante la posibilidad de resolver un problema con cualquiera de estas dos soluciones deberíamos "favorecer" la composición sobre la herencia . Hay que remarcar que la palabra "favorecer" sólo significa eso: "favorecer". No se trata de una imposición. Más bien es una recomendación cuando ambas posibilidades son aplicables. Existen muchos escenarios en los que nos encontraremos en que las dos soluciones son fácilmente ...