Как реализовать асинхронный клиент веб-службы при помощи технологии ожидания

Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.

Технология ожидания представляет собой один из способов реализации асинхронного обмена данными между клиентом веб-службы и методом веб-службы, даже если этот метод предназначен для синхронного доступа. Данная технология рассматривается в разделе "Асинхронный обмен данными с XML-веб-службами".

Этот пример основан на классе веб-службы PrimeFactorizer с методом Factorize, для которого программа Wsdl.exe создала два асинхронных прокси-метода клиента, BeginFactorize и EndFactorize.

Реализация технологии ожидания

  1. Клиент веб-службы вызывает метод Begin созданного прокси-класса.

    IAsyncResult ar = pf.BeginFactorize(factorizableNum, null, null);
    
    Dim ar As IAsyncResult = pf.BeginFactorize(factorizableNum, _
        Nothing, Nothing)
    
  2. Клиент веб-службы обращается к объекту WaitHandle через свойство AsyncWaitHandle возвращаемого объекта IAsyncResult. Клиент вызывает один из методов ожидания класса WaitHandle и ожидает сигнализацию объекта (или объектов) синхронизации.

    Если клиент использует эту технологию для асинхронного вызова только одного метода веб-службы, он может вызвать WaitOne для ожидания окончания обработки этого метода. Прочие методы ожидания: WaitAny и WaitAll.

    ar.AsyncWaitHandle.WaitOne();
    
    ar.AsyncWaitHandle.WaitOne()
    
  3. При возвращении метода ожидания клиент вызывает метод End, чтобы получить результаты.

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

Пример

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

См. также

Задачи

Как реализовать асинхронного клиента веб-службы при помощи метода обратного вызова
Как выполнить асинхронный вызов из клиента веб-службы

Основные понятия

Асинхронное взаимодействие с XML-веб-службами
Создание клиентов XML-веб-службы

Другие ресурсы

Создание клиентов для XML-веб-служб