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...
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:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static void Main(); | |
public static int Main(); | |
public static void Main(string[] args); | |
public static int Main(string[] args); |
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 esta característica. De esta forma la lista de firmas posibles para nuestro punto de entrada es ampliada con sus versiones asíncronas:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static Task Main(); | |
public static Task<int> Main(); | |
public static Task Main(string[] args); | |
public static Task<int> Main(string[] args); |
Si por ejemplo creamos una aplicación de consola con un método
Main
síncrono que intente utilizar una Api asíncrona, como por ejemplo leer un archivo con un método ReadAsync
, obtendremos un error de compilación:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static void Main(string[] args) | |
{ | |
using (var reader = File.OpenText("MyFile.txt")) | |
{ | |
var fileText = await reader.ReadToEndAsync(); | |
} | |
} |
Sin embargo, si usamos una firma asíncrona del método
Main
desaparecerá el error de compilación y el método ReadAsync
será invocado de forma asíncrona:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static async Task Main(string[] args) | |
{ | |
using (var reader = File.OpenText("MyFile.txt")) | |
{ | |
var fileText = await reader.ReadToEndAsync(); | |
} | |
} |
Nota sobre Visual Studio 2017 y C# 7.1
Si intentamos lanzar el programa y obtenemos el siguiente error es porque estamos utilizando una versión de C# anterior a la C# 7.1 y no reconoce el métodoMain
como válido:
Comentarios
Publicar un comentario