Condividi tramite


Procedura: implementare un client del servizio Web asincrono tramite la tecnica Wait

Questo argomento è specifico di una tecnologia legacy. Servizi Web XML e client di servizi Web XML devono essere creati attualmente tramite Windows Communication Foundation.

La tecnica wait costituisce un modo per implementare un client del servizio Web per comunicare in modo asincrono con un metodo del servizio Web, anche se il metodo può essere destinato a un accesso sincrono. La tecnica viene spiegata nell'argomento Comunicazione asincrona con i servizi Web XML.

Questo esempio è basato su una classe di servizio Web PrimeFactorizer con un metodo Factorizeper il quale lo strumento Wsdl.exe ha generato due metodi del proxy client asincroni, BeginFactorize e EndFactorize.

Per implementare la tecnica wait

  1. Il servizio Web esegue la chiamata al metodo Begin della classe proxy generata.

    IAsyncResult ar = pf.BeginFactorize(factorizableNum, null, null);
    
    Dim ar As IAsyncResult = pf.BeginFactorize(factorizableNum, _
        Nothing, Nothing)
    
  2. Il client del servizio Web accede a un oggetto WaitHandle tramite la proprietà AsyncWaitHandle del valore restituito di IAsyncResult. Il client esegue la chiamata a uno dei metodi wait WaitHandle della classe e attende la segnalazione da parte di uno o più oggetti di sincronizzazione.

    Se la tecnica viene utilizzata da un client esclusivamente per eseguire chiamate in modo asincrono a un metodo di servizio Web, il client può eseguire la chiamata a WaitOne per rimanere in attesa del completamento dell'elaborazione del metodo. Gli altri metodi wait sono WaitAny e WaitAll.

    ar.AsyncWaitHandle.WaitOne();
    
    ar.AsyncWaitHandle.WaitOne()
    
  3. Una volta che il metodo wait restituisce i risultati, il client esegue la chiamata al metodo End per poterli ottenere.

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

Esempio

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

Vedere anche

Attività

Procedura: implementare un client di servizio Web asincrono tramite la tecnica di callback.
Procedura: eseguire una chiamata asincrona da un client del servizio Web

Concetti

Comunicazione asincrona con i servizi Web XML
Compilazione di client dei servizi Web XML

Altre risorse

Creazione di client di servizi Web XML