sábado, 12 de diciembre de 2015

C# ConfigureAwait

En este ejemplo se usa una aplicación WPF para explicar el uso de ConfigureAwait, el ejemplo lanza una excepción: la linea Output.Content = content no es ejecutado en  el hilo de la UI porque el método ConfigureAwait(false). Observe el ejemplo.


using System.Windows;
using System.Net.Http;

namespace ConfigureAwait
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void button_Click(object sender, RoutedEventArgs e)
        {
            HttpClient httpClient = new HttpClient();

            string content = await httpClient
                .GetStringAsync("http://www.microsoft.com")
                .ConfigureAwait(false);

            Output.Content = content;
        }
    }
}

Mientras ocurre esto usted puede desear ejecuta otra tarea,  como escribir el contenido a un archivo, uno necesita definir un valor para SynchronizationContext.

using System.IO;
using System.Text;
using System.Windows;
using System.Net.Http;

namespace ConfigureAwait
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void button_Click(object sender, RoutedEventArgs e)
        {
            HttpClient httpClient = new HttpClient();

            string content = await httpClient
                .GetStringAsync("http://www.microsoft.com")
                .ConfigureAwait(false);
            
            using (FileStream sourceStream = new FileStream("temp.html",
                FileMode.Create, FileAccess.Write, FileShare.None,
                4096, useAsync: true))
            {
                byte[] encodedText = Encoding.Unicode.GetBytes(content);
                await sourceStream.WriteAsync(encodedText, 0, encodedText.Length)
                    .ConfigureAwait(false);
            }
        }
    }
}

Ambos await usan el método Configure.Await(false) porque hay verificación entre los métodos para observar aquel que hubiera terminado,  así que el código del hilo de la UI  permanece corriendo. 

Cuando creamos métodos asíncronos, es importante elegir el tipo de retorno de Task o Task<T>. Evite el tipo de retorno void. Un tipo void de retorno de un método async es efectivamente un método de tipo dispara y olvida. Usted pudiera no querer inspeccionar el tipo de retorno, y usted no puede ver si una excepción hubiera ocurrido. Usted debería usar métodos async void solamente cuando trate con eventos asíncronos.

El uso de las palabras clave asyn/await hace mucho más facíl escribir código asíncrono. En el mundo de ahora con múltiples núcleos y requerimientos para que las aplicaciones permanezcan receptivas y escalables, es importante mirar las posibilidades de usar estas nuevas palabras claves para mejorar sus aplicaciones.


No hay comentarios.:

Publicar un comentario