sábado, 2 de febrero de 2013

WCF AsyncPattern, ejemplo práctico sobre cómo aplicar el patrón en nuestros servicios

En artículos anteriores (ChannelFactory<T>,AreaTicProxy<T>) vimos como crear nuestra propia clase proxy para conectar a un servicio WCF evitando crear un "service reference" con svcUtil. Hoy veremos como implementar

IAsyncPattern

en nuestro servicio que vendría a ser equivalente a marcar esta opción de la imagen al crear un "service reference" y así usando la clase proxy del artículo anterior podríamos invocar los métodos de nuestros servicio en modo asíncrono.


Veamos como aplicar el patrón en nuestro servicio de ejemplo que creamos en el artículo anterior, necesitaremos definir 2 métodos en la interfaz por cada método que queramos hacer asíncrono. Por tanto hemos definido BeginFuncionEjemplo que recibirá, a parte de los parámetros del método original, un parámetro

AsyncCallback

y definimos también EndFuncionEjemplo que devuelve como resultado un string igual que el método síncrono FuncionEjemplo. Es importante añadir el atributo [OperationContract(AsyncPattern = true)] a los métodos asíncronos.
namespace AreaTIC.Shared.ServiceContracts
{
 [ServiceContract]
 public interface IServiceEjemplo
 {
  [OperationContract]
   string FuncionEjemplo(Tipo1 pValue);

   #region Asíncronos

   [OperationContract(AsyncPattern = true)]
   IAsyncResult BeginFuncionEjemplo(Tipo1 pValue, AsyncCallback callback, object state);
   string EndFuncionEjemplo(IAsyncResult asyncResult);

   #endregion
 }
}
En el servicio implementaremos la interfaz pero no es necesario implementar los métodos.
namespace AreaTIC.Server.Services
{
 public class ServiceEjemplo:IServiceEjemplo
 {
  string IServiceEjemplo.FuncionEjemplo(Tipo1 pValue)
  {
    Thread.Sleep(5000);

    //Implementación (...)

    return "bla bla";
  }

  public IAsyncResult BeginFuncionEjemplo(Tipo1 pValue, AsyncCallback callback, object state)
  {
    throw new NotImplementedException();
  }

  public string EndFuncionEjemplo(IAsyncResult asyncResult)
  {
    throw new NotImplementedException();
  }
 }
}
Ahora veremos ya en cliente como llamar al método asíncrono del servicio usando el proxy basado en

ChannelFactory<T>

que creamos en el artículo anterior. En primer lugar necesitaremos una función que reciba un parámetro IAsyncResult a la que he llamado Respuesta, el siguiente paso es llamar a BeginFuncionEjemplo asignando el método this.Respuesta al delegado

AsyncCallback

.
 AreaTicWCFProxy mProxy;
     
 void Llamada()
 {
   mProxy = new AreaTicWCFProxy("EjemploAreaTIC");
   mProxy.client.BeginFuncionEjemplo(new Tipo1(),new AsyncCallback(this.Respuesta), null);
   Console.WriteLine("sigo con la ejecución del método Main");
   Console.Read();
 }

 void Respuesta(IAsyncResult asyncResult) 
 {
   string result = mProxy.client.EndFuncionEjemplo(asyncResult).ToString();
   Console.Write(result);
   Console.ReadLine();
 }
Es importante declarar la instancia de

AreaTicWCFProxy

en un ámbito de clase para tener acceso a la misma instancia desde las dos funciones.

En resumen, en los tres últimos artículos de la sección WCF-ChannelFactory hemos visto como crear nuestra clase proxy personalizada por pasos que puede ser muy útil si trabajáis en una arquitectura dónde las aplicaciones acceden a datos mediante servicios

WCF

.

Hasta aquí el artículo de hoy. Recuerda que puedes seguir

areaTIC

también en las redes sociales, esperamos tu participación!


No hay comentarios:

Publicar un comentario en la entrada