Cómo: Implementar un cliente de servicio web asincrónico con la técnica de espera
Este tema es específico de una tecnología heredada. Ahora, los servicios Web XML y los clientes de servicios Web XML deben crearse con Windows Communication Foundation.
La técnica de espera es una manera de implementar un cliente de servicios Web para comunicar de forma asincrónica con un método de servicio Web, aunque el método se puede pensar para el acceso sincrónico. La técnica se explica en el tema Comunicación de forma asincrónica con servicios Web XML.
Este ejemplo está basado en una clase de servicio Web PrimeFactorizer con un método Factorize, para el que la herramienta Wsdl.exe ha generado dos métodos de proxy de cliente asincrónicos: BeginFactorize y EndFactorize.
Para implementar la técnica de espera
El cliente de servicios Web llama al método Begin de la clase de proxy generada.
IAsyncResult ar = pf.BeginFactorize(factorizableNum, null, null);
Dim ar As IAsyncResult = pf.BeginFactorize(factorizableNum, _ Nothing, Nothing)
El cliente de servicios Web tiene acceso a un objeto WaitHandle a través de la propiedad AsyncWaitHandle del IAsyncResult devuelto. El cliente llama a uno de los métodos de espera de la clase WaitHandle y espera que se señalen uno o más objetos de sincronización.
Si un cliente utiliza esta técnica para llamar de forma asincrónica a un solo método de servicios Web, puede llamar a WaitOne para esperar que se complete el procesamiento de ese método. Otros métodos de espera son WaitAny y WaitAll.
ar.AsyncWaitHandle.WaitOne();
ar.AsyncWaitHandle.WaitOne()
Cuando el método de espera vuelve, el cliente llama al método End para obtener los resultados.
results = pf.EndFactorize(ar);
results = pf.EndFactorize(ar)
Ejemplo
// -----------------------------------------------------------------------// Async Variation 2.
// Asynchronously invoke the Factorize method,
//without specifying a call back.
using System;
using System.Runtime.Remoting.Messaging;
// MyFactorize, is the name of the namespace in which the proxy class is
// a member of for this sample.
using MyFactorize;
class TestCallback
{
public static void Main(){
long factorizableNum = 12345;
PrimeFactorizer pf = new PrimeFactorizer();
// Begin the Async call to Factorize.
IAsyncResult ar = pf.BeginFactorize(factorizableNum, null, null);
// Wait for the asynchronous operation to complete.
ar.AsyncWaitHandle.WaitOne();
// Get the completed results.
long[] results;
results = pf.EndFactorize(ar);
//Output the results.
Console.Write("12345 factors into: ");
int j;
for (j = 0; j<results.Length;j++){
if (j == results.Length - 1)
Console.WriteLine(results[j]);
else
Console.Write(results[j] + ", ");
}
}
}
Imports System
Imports System.Runtime.Remoting.Messaging
Imports MyFactorize ' Proxy class namespace
Public Class TestCallback
Public Shared Sub Main()
Dim factorizableNum As Long = 12345
Dim pf As PrimeFactorizer = new PrimeFactorizer()
' Begin the Async call to Factorize.
Dim ar As IAsyncResult = pf.BeginFactorize(factorizableNum, Nothing, Nothing)
' Wait for the asynchronous operation to complete.
ar.AsyncWaitHandle.WaitOne()
' Get the completed results.
Dim results() as Long
results = pf.EndFactorize(ar)
'Output the results.
Console.Write("12345 factors into: ")
Dim j as Integer
For j = 0 To results.Length - 1
If j = (results.Length - 1) Then
Console.WriteLine(results(j) )
Else
Console.Write(results(j).ToString + ", ")
End If
Next j
End Sub
End Class
Vea también
Tareas
Cómo: Implementar un cliente de servicio Web asincrónico con la técnica de devolución de llamada
Cómo: Realizar una llamada asincrónica desde un cliente de servicios web
Conceptos
Comunicar de forma asincrónica con servicios web XML
Generar clientes de servicios web XML