Partager via


Comment : implémenter un client de service Web asynchrone à l'aide de la technique d'attente

Cette rubrique est spécifique à une technologie existante. Les services Web XML et les clients du service Web XML doivent à présent être créés à l'aide de Windows Communication Foundation.

La technique d'attente est un moyen d'implémenter un client de service Web pour communiquer de façon asynchrone avec une méthode de service Web, même si la méthode est prévue pour un accès synchrone. La technique est expliquée dans la rubrique Communiquer de façon asynchrone avec les services Web XML.

Cet exemple se base sur une classe de service Web PrimeFactorizer avec une méthode Factorize, pour laquelle l'outil Wsdl.exe a généré deux méthodes de proxy clientes asynchrones, BeginFactorize et EndFactorize.

Pour implémenter la technique d'attente

  1. Le client de service Web appelle la méthode Begin de la classe proxy générée.

    IAsyncResult ar = pf.BeginFactorize(factorizableNum, null, null);
    
    Dim ar As IAsyncResult = pf.BeginFactorize(factorizableNum, _
        Nothing, Nothing)
    
  2. Le client de service Web accède à un objet WaitHandle via la propriété AsyncWaitHandle du IAsyncResult retourné. Le client appelle l'une des méthodes d'attente de la classe WaitHandle et attend un ou plusieurs objets de synchronisation à signaler.

    Si un client utilise cette technique pour appeler une seule méthode de service Web de façon asynchrone, il peut appeler WaitOne pour attendre le traitement complet de cette méthode. D'autres méthodes d'attente sont WaitAny et WaitAll.

    ar.AsyncWaitHandle.WaitOne();
    
    ar.AsyncWaitHandle.WaitOne()
    
  3. Lorsque la méthode d'attente est retournée, le client appelle la méthode End pour obtenir les résultats.

    results = pf.EndFactorize(ar);
    
    results = pf.EndFactorize(ar)
    

Exemple

// -----------------------------------------------------------------------// 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

Voir aussi

Tâches

Comment : implémenter un client de service Web asynchrone à l'aide de la technique de rappel
Comment : procéder à un appel asynchrone d'un client de service Web

Concepts

Communications asynchrones avec les services Web XML
Création de clients de service Web XML

Autres ressources

Création de clients pour les services Web XML