[email protected]

Asunción, PARAGUAY

Ingeniería y desarrollo de software, emprendimiento, cursos

7 de marzo de 2014

Consumir Servicios Web síncronos y asincrónicos

Introducción

El .NET Framework 4.5 nos trae muchos beneficios a la hora de consumir recursos de la mejor manera posible. Un aspecto muy importante en el desarrollo de aplicaciones es la respuesta de la interfaz de usuario. Cuando realizamos tareas con alto nivel de procesamiento, la ventana que estamos utilizando presenta la famosa frase "No Responde" en su título, esto se da porque el procesador se encuentra realizado una tarea que demanda muchos recursos y el proceso se encuentra ocupado realizando esa tarea.

Es aquí donde se genera la necesidad de realizar "trabajo en segundo plano", que permite realizar tareas en paralelo o simultáneo dividiendo el trabajo del procesador en varias tareas más pequeñas, utilizando el concepto de "divide y vencerás". Es por eso que con el Framework 4.5 podemos obtener fácilmente acceso síncrono y asíncronico a los métodos.

Los métodos síncronos son funciones que deben ejecutarse completamente y retornar un resultado luego de procesarse, es por eso que la ventana puede bloquearse o congelarse, ya que la interfaz de usuario debe esperar que la función culmine su ejecución para retomar el hilo del procesamiento.

Los métodos asincrónicos son funciones que se ejecutan en segundo plano y retornan el resultado luego de procesarse, pero la ejecución del llamador continúa ejecutándose sin esperar el resultado del método asincrónico, una vez que el método retorne el resultado este lo comunica a la interfaz de usuario, de esta manera, el usuario pueda continuar con la ejecución de la ventana en particular.

Ejemplo práctico

Para explicar mejor esta situación crearemos un pequeño servicio web que retorna un mensaje "Hola Mundo, desde un servicio web", con un retraso de 10 segundos; y una pequeña aplicación cliente, con dos botones que llamará al servicio de manera síncrona y de manera asincrónica.

Servicio Web XML

Básicamente creamos un servicio web que retorne el mensaje "Hola Mundo, desde un servicio web", para ello, simplemente creamos en Visual Studio un proyecto vacío, y agregamos un elemento del tipo Servicio Web con nombre "WebService1.asmx". En la clase correspondiente colocamos las siguientes líneas de código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace WebApplication
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class WebService1 : System.Web.Services.WebService
    {
        [WebMethod]
        public string HolaMundo()
        {
            //Retrasamos el método por 10 segundos para probar
            System.Threading.Thread.Sleep(10000);

            return "Hola Mundo, desde un servicio web";
        }
    }
}

Aplicación cliente: WPF

En esta simple aplicación demostraremos cómo consumir servicio web de manera síncrona y asincrónica utilizando como aplicación cliente la plataforma WPF (Windows Presentation Foundation).

El código  XAML de la aplicación sería el siguiente:
<Window x:Class="WpfApplication1.MainWindow"
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     Title="MainWindow" Height="350" Width="525">
     <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="20" />
            <RowDefinition Height="20" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
        </Grid.ColumnDefinitions>

        <Button Margin="1" Content="Síncrono" Click="Button_Click_1" />
        <Button Margin="1" Grid.Row="1" Content="Asincrónico" Click="Button_Click_2" />
    </Grid>
</Window>
El método síncrono esperará 10 segundos (o más) para imprimir el mensaje debido a que éste espera a que el método ejecute todo el código para poder retornar el resultado. Durante ese lapso de tiempo, no será posible realizar el evento "hover" (efecto de pasar por encima del botón y animarlo) ni mover la ventana o realizar acción alguna. Por ejemplo, veamos el código siguiente:
private void Button_Click_1(object sender, RoutedEventArgs e)
 {
    //Servicio síncrono
    Servicio.WebService1SoapClient cliente = new Servicio.WebService1SoapClient();
    MessageBox.Show(cliente.HolaMundo());
 }
Se imprimirá el mensaje correspondiente en un cuadro de diálogo, pero la ventana previa se bloqueará hasta que termine de procesarse.

Por otro lado, el método asincrónico  procesa la llamada en el servidor sin esperar la respuesta, esto hace que la interfaz de usuario nunca se congele y pueda seguir utilizando la aplicación, inclusive si existe una excepción (tratado, claro) seguirán realizándose las tareas pendientes.
private async void Button_Click_2(object sender, RoutedEventArgs e)
{
    var cliente = new Servicio.WebService1SoapClient();
    Servicio.HolaMundoResponse response = await cliente.HolaMundoAsync();
    MessageBox.Show(response.Body.HolaMundoResult);
}
En el código existen dos palabras claves para el procesamiento en segundo plano, las cuales son:
Estas palabras claves son fundamentales para la correcta aplicación del procesamiento en segundo plano.

Conclusión

En este artículo hemos visto como utilizar métodos asincrónicos y diferenciarlos de un método síncrono, para evitar bloqueos en la interfaz de usuario. Fácilmente podemos crear aplicaciones responsivas sin demasiado esfuerzo. Lo importante es tener en cuenta la utilidad de cada función.

Hey, we've just launched a new custom color Blogger template. You'll like it - https://t.co/quGl87I2PZ
Suscribíte al boletín