Как реализовать асинхронный клиент веб-службы при помощи технологии ожидания
Этот раздел посвящен технологии прежних версий. Веб-службы XML и клиенты веб-служб XML должны создаваться с использованием Windows Communication Foundation.
Технология ожидания представляет собой один из способов реализации асинхронного обмена данными между клиентом веб-службы и методом веб-службы, даже если этот метод предназначен для синхронного доступа. Данная технология рассматривается в разделе "Асинхронный обмен данными с XML-веб-службами".
Этот пример основан на классе веб-службы PrimeFactorizer с методом Factorize, для которого программа Wsdl.exe создала два асинхронных прокси-метода клиента, BeginFactorize и EndFactorize.
Реализация технологии ожидания
Клиент веб-службы вызывает метод Begin созданного прокси-класса.
IAsyncResult ar = pf.BeginFactorize(factorizableNum, null, null);
Dim ar As IAsyncResult = pf.BeginFactorize(factorizableNum, _ Nothing, Nothing)
Клиент веб-службы обращается к объекту WaitHandle через свойство AsyncWaitHandle возвращаемого объекта IAsyncResult. Клиент вызывает один из методов ожидания класса WaitHandle и ожидает сигнализацию объекта (или объектов) синхронизации.
Если клиент использует эту технологию для асинхронного вызова только одного метода веб-службы, он может вызвать WaitOne для ожидания окончания обработки этого метода. Прочие методы ожидания: WaitAny и WaitAll.
ar.AsyncWaitHandle.WaitOne();
ar.AsyncWaitHandle.WaitOne()
При возвращении метода ожидания клиент вызывает метод 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-веб-службы