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)
}
Gracias señor, siga con sus artículos sobre WCF por favor !!!
Buen articulo, cual seria la diferencia entre ajax q tambien llama a wcf de forma asincrona… y como seria de utilizarlo…
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.
Hola de nuevo.
Después de buscar un poco, he encontrado un proyecto en el que consigue hacer una llamada síncrona. Es una forma un poco rudimentaria, pero válida a fin de cuentas.
El link:
http://beta.codeproject.com/script/Articles/ArticleVersion.aspx?aid=65906&av=85225
Un saludo y gracias de todas formas.