Llamar de forma asincrona a servicios WCF

A veces nos interesa llamar de forma asincrona a un servicio WCF que sabemos que va a tardar cierto tiempo en procesarse y queremos que nuestro proceso cliente siga haciendo cosas mientras el servicio se va ejecutando.


Es bastante sencillo utilizar llamadas asincronas en servicios WCF, solo tenemos que poner el parametro /async cuando ejecuto la herramienta svcutil para generar el proxy en el cliente


 



SvcUtil http://localhost:8000/ /async /out:ProxyAsync.cs /noConfig


 


De manera que me generara el proxy(ProxyAsync) . con mis metodos del ServiceContract pero me añadira un metodo BeginNombreMetodo como por ejemplo si mi servicio tiene el metodo suma



int Suma(int numer1,int number2)


Me generara una clase en el proxy con la firma



IAsyncResult BeginSuma(int number1,int number2,AsyncCallback callback,object asyncState)


Donde los dos  primeros parametros, son los parametros del metodo y luego tiene el metodo donde se llamara cuando haya finalizado el servicio WCF en el servidor y un objeto con el estado de la sincronización


EL metodo que llamara cuando se finalize el servicio debe de tener la firma OnCompletion(IAsyncResult result)


En el parametro result tengo el valor que devuelva el servicio WCF, que recogere a traves de un metodo que genera el proxy que se llamara siempre EndNombreMetodo


Un ejemplo sencillo seria


 

  private void Btn_Click(object sender, EventArgs e)
{
m_Proxy.BeginSuma(2, 3, OnCompletion, null);
}
void OnCompletion(IAsyncResult result)
{
int sum = m_Proxy.EndSuma(result);
result.AsyncWaitHandle.Close();

MessageBox.Show(«Suma = » + sum)
}


4 comentarios sobre “Llamar de forma asincrona a servicios WCF”

  1. Hola Oskar.

    Estoy haciendo una aplicación en Silverlight(SL) con un acceso a datos mediante un fichero WCF en el proyecto ASP.NET que le embebe.
    Por defecto, al crear una referencia web desde el proyecto SL, se me genera una conexión asíncrona con todos los elementos que comentas en el post.
    Debido a las necesidades de la APP, necesito que esa comunicación sea síncrona, en vez de asíncrona. ¿Sabrías decirme que es lo que debo de cambiar, o en el caso de que no se pudiese, como lo puedo hacer?

    Muchas gracias y un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *