Compartir a través de


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

  1. 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)
    
  2. 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()
    
  3. 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

Otros recursos

Crear clientes de servicios web XML