Created
June 12, 2014 02:29
-
-
Save Fhernd/516e886b80dc7f264e14 to your computer and use it in GitHub Desktop.
Demostración del uso del modificador async y el operador await en C#.
This file contains 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
using System; | |
using System.IO; | |
using System.Threading.Tasks; | |
namespace Articulos.Cap04 | |
{ | |
public sealed class UsoAsyncAwait | |
{ | |
public static void Main() | |
{ | |
// Creación de una tarea con | |
// System.Threading.Task.Task: | |
Task tarea = new Task(ProcesoDatosAsync); | |
// Inicia la ejecución de la tarea: | |
tarea.Start(); | |
// Espera a que la tarea se complete: | |
tarea.Wait(); | |
Console.ReadLine(); | |
} | |
// Este método se encarga de de procesaro datos de un archivo | |
// de manera asincrónica: | |
public static async void ProcesoDatosAsync() | |
{ | |
// Crea una tarea para la el control | |
// asincrónico del archivo pasado como argumento: | |
Task<int> tarea = ProcesamientoArchivoAsync("C:\\shared\\archivogrande.txt"); | |
// La invocación asincrónica de `ProcesamientoArchivoAsync` | |
// no bloque la ejecución de las siguientes líneas de | |
// código, como esta: | |
Console.WriteLine ("\nEspere mientras el procesamiento del archivo se completa.\n"); | |
// En este punto sí esperamos a que `ProcesamientoArchivoAsync` | |
// se termine de ejecutar: | |
int x = await tarea; | |
Console.WriteLine ("Valor computado finalizado `ProcesamientoArchivoAsync`: {0}", x.ToString()); | |
} | |
// Se encarga de procesar el archivo de texto: | |
static async Task<int> ProcesamientoArchivoAsync(string archivo) | |
{ | |
// Indicador de que el método `ProcesamientoArchivoAsync` | |
// ya ha iniciado a ejecutarse: | |
Console.WriteLine ("\n`ProcesamientoArchivoAsync ya ha iniciado..."); | |
int contador = 0; | |
using (StreamReader sr = new StreamReader(archivo)) | |
{ | |
// Invocamos el método asincrónico `ReadToEndAsync` de | |
// `StreamReader`, el cual nos devuelve el contenido del | |
// archivo de texto especificado en el constructor de `StreamReader`: | |
string textoArchivo = await sr.ReadToEndAsync(); | |
// Finalizada la ejecución de `ReadToEndAsync`, obtenemos la | |
// longitud de la cadena de caracteres: | |
contador += textoArchivo.Length; | |
// Proceso demo que puede tardar mucho tiempo en completarse: | |
for (int i = 0; i < 10000; i++) | |
{ | |
int x = textoArchivo.GetHashCode(); | |
if (x == 0) | |
{ | |
contador--; | |
} | |
} | |
} | |
Console.WriteLine ("Salida del método `ProcesamientoArchivoAsync`."); | |
return contador; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment