Debido a una operación de mantenimiento, el acceso al sitio web de Ediciones ENI estará interrumpido a primera hora del martes 10 de diciembre. Le invitamos a anticipar sus compras. Lamentamos las molestias ocasionadas.
Debido a una operación de mantenimiento, el acceso al sitio web de Ediciones ENI estará interrumpido a primera hora del martes 10 de diciembre. Le invitamos a anticipar sus compras. Lamentamos las molestias ocasionadas.
  1. Libros
  2. C# 10 y Visual Studio Code
  3. Conceptos avanzados
Extrait - C# 10 y Visual Studio Code Fundamentos del lenguaje
Extractos del libro
C# 10 y Visual Studio Code Fundamentos del lenguaje
1 opinión
Volver a la página de compra del libro

Conceptos avanzados

Asincronismo

1. Funcionamiento básico

Antes de abordar el asincronismo de manera detallada, es necesario introducir algunos conceptos, especialmente para comprender correctamente dos ideas que son distintas, pero a menudo se confunden: el paralelismo y el asincronismo.

En esta sección vamos a tratar el concepto de asincronismo, que consiste en relegar una operación a un segundo plano y seguir ejecutando el código restante cuando se ha terminado la operación. Para comprender correctamente la lógica detrás del asincronismo, podemos intentar hacer una comparación con un ejemplo de la vida diaria.

Cuando se pone en marcha una lavadora, esta realiza su trabajo de manera asíncrona respecto a nosotros, lo que permite, durante este tiempo, ocuparse de otra cosa. Cuando ha terminado el ciclo, emite un sonido para avisar, y se puede recoger la ropa para tenderla. Considerando que somos el programa principal, y que la ropa es el código que se debe ejecutar de manera asíncrona, podemos observar el concepto de asincronismo.

Cuando metemos la ropa dentro de la máquina y la ponemos en marcha, delegamos trabajo aplicado a esta ropa en otra entidad que no somos nosotros. Cuando este trabajo ha terminado, podemos retomar nuestro propio trabajo. Aquí tenemos el concepto de asincronismo.

En cuanto al paralelismo, se trata de hacer varias cosas al mismo tiempo. Por ejemplo, si se elige poner en marcha una lavadora y, en el mismo intervalo, también se pone en marcha el lavavajillas, las dos máquinas funcionarán en paralelo consumiendo recursos compartidos (agua y electricidad). Esto permite optimizar el tiempo de ejecución compartiendo los mismos recursos.

No se deben confundir los dos conceptos, aunque sean complementarios. Especialmente porque el uso de uno u otro depende en gran medida del uso buscado:

  • El asincronismo se usa cuando queremos acceder a un recurso sobre el que no tenemos control respecto al tiempo de acceso (lectura de archivo, recurso de red, base de datos, consulta web, etc.). También podemos usar el asincronismo cuando queremos ejecutar una parte de código sin tener certeza sobre la duración de la ejecución, y queremos que esta ejecución no bloquee nuestro programa principal.

  • El paralelismo se usa cuando queremos explotar los recursos al máximo, especialmente con fines de optimización...

Algoritmia avanzada

Durante todo el libro, hemos estudiado la algoritmia básica, que permite abarcar un amplio perímetro funcional. Sin embargo, C# y el framework .NET tienen una cantidad enorme de funcionalidades más avanzadas. En este capítulo vamos a estudiar algunas.

1. Programación dirigida por eventos

La programación dirigida por eventos permite reaccionar a eventos que se producen durante la ejecución de una aplicación. Hasta ahora, hemos reaccionado de manera síncrona a un evento particular (como, por ejemplo, esperar a que el usuario introduzca un valor en la consola). Sin embargo, C# proporciona un mecanismo potente que permite hacer programación reactiva, es decir, no esperar a un evento cualquiera, sino reaccionar solo cuando se produzca un evento particular.

a. Los delegate

Para entender bien el tema, es necesario comprender un principio que se remonta a C# 2: los delegate. Un delegate es el equivalente de un descriptor de un método, y una variable de tipo delegate corresponde a un puntero efectivo hacia un método.

Para declarar un delegate, hay que usar la palabra clave dedicada, delegate; luego declarar la firma de método a la que se quiere apuntar, con su tipo de retorno y sus posibles parámetros (o paréntesis vacíos si no hay ningún parámetro):

public delegate void MiDelegadoVoidSinParametros(); 
public delegate string MiDelegadoDevuelveString(); 
public delegate void MiDelegadoVoidConParametros(string data); 

En el bloque de código anterior, hemos declarado tres delegate:

  • El primero permite apuntar a un método que devuelve void y no toma parámetros.

  • El segundo permite apuntar a un método que devuelve un string y no toma parámetros.

  • El tercero permite apuntar a un método que devuelve void y toma un parámetro de tipo string.

Los delegate se pueden declarar en una clase y solo se podrán usar dentro de esta última. Si no, también se pueden declarar directamente en un espacio de nombres (al mismo nivel que una clase) para usarlos en varias clases.

Una vez definido un delegate, se puede declarar una variable del tipo del delegate y hacerlo apuntar hacia cualquier método que tenga la firma requerida: 

Public delegate void MiDelegadoVoidSinParametros(); 
public class Cap7Delegates 
{ 
    public...