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;
}
}
}