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