Источник: byteblocks
В своем предыдущем сообщении я привел пример кода, позволяющего использовать веб-сервисы Amazon.com в клиентском приложении. В примере метод ItemSearch вызывается синхронно. После ожидания и получения ответа сервера, он возвращает результат. Из-за необходимости ожидания ответа сервера, управление основной программе не может быть возвращено немедленно. Но есть возможность воспользоваться асинхронными методами - пока Вы ждете ответа сервера, программа может выполнять другие задачи.
Вам ничего не придется писать вручную, чтобы создать код для асинхронного вызова веб-сервиса amazon.com. Все что нужно сделать - в мастере добавления сервиса нажать кнопку "Дополнительно" и поставить галку "генерировать асинхронные методы".

.png)
Код ниже показывает, как выполнить асинхронный вызов метода ItemSearchAsync и получить EventWaitHandle, с помощью которого приложение будет ждать завершения выполнения операции.
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading;
using AmazonClient.AmazonData;
namespace AmazonClient
{
class Program
{
static void Main(string[] args)
{
System.ServiceModel.BasicHttpBinding httpBinding =
new BasicHttpBinding();
httpBinding.Name = "AWSECommerceServiceBinding";
BasicHttpSecurity security = httpBinding.Security;
security.Mode = BasicHttpSecurityMode.None;
EndpointAddress addr = new EndpointAddress("http://soap.amazon.com/onca/soap?Service=AWSECommerceService");
AWSECommerceServicePortTypeClient client =
new AWSECommerceServicePortTypeClient(httpBinding, addr);
try
{
ItemSearch srch = new ItemSearch();
srch.AssociateTag = "netomatix-20";
srch.AWSAccessKeyId = "1QEW6V1V3C5GK7WB2A02";
ItemSearchRequest req = new ItemSearchRequest();
req.Keywords = "silverlight";
req.SearchIndex = "Books";
srch.Request = new ItemSearchRequest[1] { req };
EventWaitHandle searchCompletionEvent =
new EventWaitHandle(false, EventResetMode.ManualReset);
client.ItemSearchCompleted +=
new EventHandler(ItemSearchCompleted);
try
{
client.ItemSearchAsync(srch, searchCompletionEvent);
searchCompletionEvent.WaitOne();
}
catch (TimeoutException timeOutEx)
{
Console.WriteLine("Request timed out: {0}", timeOutEx.Message);
}
catch (FaultException faultEx)
{
Console.WriteLine("SOAP fault: {0}", faultEx.Message);
}
catch (CommunicationException commEx)
{
Console.WriteLine("Failed to communicate with web server: {0}",
commEx.Message);
}
Console.WriteLine("Thank you for choosing ByteBlocks!");
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void ItemSearchCompleted(object sender,
ItemSearchCompletedEventArgs e)
{
ItemSearchResponse resp = e.Result;
EventWaitHandle waitHandle = e.UserState as EventWaitHandle;
waitHandle.Set();
}
}
} Я передаю EventWaitHandle как состояние в асинхронный метод. И затем, в обработчике события завершения метода, сигнализирую о готовности ожидающему потоку.
Перевод: Роман Голубин
Комментариев нет:
Отправить комментарий