8 апр. 2010 г.

Асинхронное использование веб-сервисов Amazon.com

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

 Вам ничего не придется писать вручную, чтобы создать код для асинхронного вызова веб-сервиса amazon.com. Все что нужно сделать - в мастере добавления сервиса нажать кнопку "Дополнительно" и поставить галку "генерировать асинхронные методы".



 Код ниже показывает, как выполнить асинхронный вызов метода 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 как состояние в асинхронный метод. И затем, в обработчике события завершения метода, сигнализирую о готовности ожидающему потоку.

Перевод: Роман Голубин

Комментариев нет:

Отправить комментарий