Программирование >>  Программирование с использованием ajax 

1 ... 227 228 229 [ 230 ] 231 232 233 ... 396


Асинхронный вызов службы

При отправке сообщения по сети всегда нужно учитывать сетевую задержку. При синхронном вызове Web-службы клиентское приложение блокируется до момента возвращения вызова. В локальной сети это может происходить достаточно быстро. Однако следует уделить внимание инфраструктуре сети производственной системы.

Сообщения Web-службе можно отправлять асинхронно. Прокси-клиент создает не только синхронные методы, но и асинхронные, однако при использовании Windows-приложений ситуация носит особый характер. Поскольку каждый элемент управления Windows связан с единственным потоком, методы и свойства элементов управления Windows могут вызываться только из создающего потока. Прокси-класс .NET 3.5 предоставляет ряд специальных функциональных возможностей, как видно из сгенерированного кода прокси-объекта.

фактическое заняти АсинхрОННЫЙ ВЫЗОВ СЛужбы

На этот раз применим асинхронную реализацию прокси-класса.

1. Внесите изменение в код сгенерированного прокси-класса, выбрав ссылку службы WebServicesSample. Откройте контекстное меню и выберите команду Configure Service Reference (Конфигурировать ссылку службы). Откроется диалоговое окно Service Reference Settings (Настройки ссылки на службу), показанное на рис. 21.13.

S№ip(eCH nLW bS*rvtcMS mptt гЛС9 ЯвФяппс

Addmi

Acceii lr n lor gpfitiated cUiiei

D > Type

urv ,5 g *i rttP m*f.jg, cont.ert, Co tt on tjipe

птур<

RruJ* 1>р*1 >o eO iff fnccd ijrmb r j Uf trPf 1 iPf c< > if ff need lem Jmjtoruc if JVI** !!: JSyitenCore jfj JISrfmDsH ; f OSotf m Data D taS tbiem orn ; У -JS it m DtplOTfTifnt ; j TJS,jlfmD<awrfifl J Г -ISrUtm Runtimt Sf. i(;*tion i -JSjitfm SffvxtModfl

Puc. 21.13. Диалоговое сжпо Service Reference Settings

2. В диалоговом окне Service Reference Settings установите флажок Generate asynchronous operations (Генерировать асинхронные операции).

3. Чтобы вызывать Web-службу асинхронно, измените реализацию метода buttonlClick (код приведен ниже). После того как экземпляр прокси-объекта создан, добавьте к событию ReverseStringCompleted обработчик по имени clientReverseStringCompleted. Затем вызовите асинхронный метод прокси-объекта ReverseStringAsync и передайте ему свойство Text из textBoxl. Метод asnyc создает поток, который выполняет обращение к Web-службе:



private void buttonl Click(object sender, EventArgs e) {

Асинхронная версия

WebServicesSample.ServicelSoapClient client =

new WebServicesSample.ServicelSoapClient(); client. ReverseStringCon5>leted += new

EventHandler<WebServicesSaziple. ReverseStringCoinpletedEventAr9s> (

client ReverseStringCoi4>leted) ; client.ReverseStringAsync(textBoxl.Text);

4. Теперь реализуйте метод обработчика clientReverseStringCompleted:

private void client ReverseStringCompleted(object sender, WebServicesSample.ReverseStringCompletedEventArgs e)

textBox2.Text = e.Result;

Этот метод будет вызываться по завершении вызова Web-службы. При данной реализации свойство Result параметра ReverseStringComletedEventArgs передается свойству Text объекта textBox2.

5. Теперь можно запустить клиентское приложение еще раз, чтобы протестировать асинхронный вызов службы. В реализацию Web-службы можно добавить также интервал приостановки, чтобы убедиться, что интерфейс пользователя клиентского приложения не блокируется на время вызова Web-службы.

Описание полученных результатов

Следующий фрагмент кода представляет асинхронную версию метода ReverseString О . Асинхронная реализация прокси-класса всегда содержит метод, который можно вызывать асинхронно, и событие, позволяющее определять, какой метод должен вызываться по завершении метода Web-службы. Рассмотрим эти особенности подробнее. Метод ReverseStringAsync () содержит только те параметры, которые отправляются серверу Считывание данных, полученных от клиента, можно выполнять, присваивая обработчик события событию ReverseStringCompleted, имеющему тип EventHandler<ReverseStringCompletedEventArgs>. Он представляет собой делегат, в то время как второй параметр (ReverseStringCompletedEventArgs) создается из выходных параметров метода ReverseString (). Свойство Result класса ReverseStringCompletedEventArgs содержит возвращаемые данные Web-службы. Эта реализация работает благодаря делегату SendOrPostCallback. Он направляет вызов в нужный поток элемента управления Windows Forms:

public event System.EventHandler<ReverseStringCompletedEventArgs>

ReverseStringCompleted; public void ReverseStringAsync(string message) { this.ReverseStringAsync(message, null);

public void ReverseStringAsync(string message, object userState) { if ((this.onBeginReverseStringDelegate == null)) { this.onBeginReverseStringDelegate =

new BeginOperationDelegate(this.OnBeginReverseString);

if ((this.onEndReverseStringDelegate == null)) { this.OnEndReverseStringDelegate =

new EndOperationDelegate(this.OnEndReverseString);



if ((this.onReverseStringCompletedDelegate == null)) { this.onReverseStringCompletedDelegate =

new System.Threading.SendOrPostCallback( this.OnReverseStringCompleted);

base.InvokeAsync(this.onBeginReverseStringDelegate, new object[ message}, this.onEndReverseStringDelegate, this.onReverseStringCompletedDelegate, userState);

public void OnReverseStringOperationCompleted (ob:)ect arg) { if ((this.ReverseStringCompleted !=null)) {

InvokeAsyncCompletedEventArgs e =

((InvokeAsyncCompletedEventArgs)(state)); this.ReverseStringCompleted(this,

new ReverseStringCompletedEventArgs(e.Results, e.Error,

e.Cancelled, e.UserState));

public partial class ReverseStringCompletedEvenArgs : System.ComponentModel.AsyncCompletedEventArgs

private object [ ] results;

internal ReverseStringCompletedEventArgs(object[] results.

System.Exception exception, bool cancelled, object userState)

: base(exception, cancelled, userState) { this.results = results;

public string Result {

get {

this.RaiseExceptionlfNecessary 0; return ((string)(ths.results[0]));

Реализация клиента ASP.NET

Теперь эту же службу можно использовать из клиентского приложения ASP.NET. Ссылка на службу может выполняться так же, как в приложении Windows Forms.

Практическое занята Создание клиентского приложения ASRNET

1. Откройте ранее созданную Web-службу WebServi сеs Sample.

2. Добавьте в решение новый Web-сайт С# ASP.NET, назовите его ASPNETClient и добавьте в Web-форму два текстовых поля и кнопку, как показано на рис. 21.14.

3. Добавьте ссылку на службу http: localhost/web-servicesample/service.asmx, как это было выполнено в Windows-приложении. В зависимости от кон- Рис. 21.14. Форма сайта кретной конфигурации может потребоваться указа- ASPNETClient

ние номера порта.



1 ... 227 228 229 [ 230 ] 231 232 233 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика