Здравствуйте, Максималист, Вы писали:
М>Здравствуйте, samius, Вы писали:
М>>>На клиентской стороне, его реализует прокси, которые ходит к серверу через Web-service.
М>>>На серверной стороне, его реализует класс ходящий к базе и содержащий, собственно, логику приложения.
S>>о_О
S>>Т.е. клиент синхронно вызывает метод BeginGetData на сервере? Занятно. Может быть в этом проблема?
М>Я не понял, что вы не поняли
М>Клиент вызывает асинхронный метод прокси. Прокси шлет пакеты на сервер. Серверный транспорт, получив пакеты, вызывает синхронный метод модели. Модель возвращает результат. Сервер шлет пакеты клиенту. Прокси уведомляет через метод обратного вызова, что данные получены
Все слишком сложно!
Клиент вызывает асинхронный метод прокси, и ждет пока вызов этого метода не завершится. Я правильно понял? прокси шлет пакеты на сервер, сервер вызывает асинхронный метод модели и только после этого завершает асинхронный метод, сервер шлет пакеты, а прокси на стороне клиента их принимает и понимает что вызов асинхронного метода завершен. Только после этого клиент возвращается в луп сообщений и ждет обратного вызова от сервера, чтобы синхронно вызвать метод EndGetData у прокси, и опять все заново, только обратно с данными.
Таким образом вместо синхронного выполнения одного удаленного метода GetData, клиент выполняет синхронно два удаленных метода, и пока выполняет их втормаживает, но между этими методами обрабатывает сообщения.
М>Это как "клиент синхронно вызывает метод BeginGetData на сервере" или асинхронно? 
Синхронно от асинхронно отличается тем, что в случае синхронного вызова, вызывающий поток ждет окончания вызова, а в случае асинхронного — нет. Так вот, вызывая метод у BeginGetData у прокси, вы ждете пока пакеты слетают на сервер, сервер поставит в очередь вызов GetData, пакеты прилетят с сервера и только тогда вызов метода BeginGetData у прокси завершится. Точно так же с EndGetData.
Вместо этой галиматьи вам нужно было вызвать метод прокси GetData(), но вызвать его асинхронно. Т.е. создать делегат с сигнатурой
delegate void GetDataDelegate();
либо
Action
потом
var d = new GetDataDelegate(proxy.GetData);
asyncResult = d.BeginInvoke(EndInvokeCallback, null);
При этом не ожидая даже начала отправки пакетов на сервер вы возвращаетесь в цикл сообщений GUI и ждете вызова EndInvokeCallback, крутясь в цикле сообщений.
В методе EndInvokeCallback вы вызываете
data = d.EndInvoke(asyncResult)
и просто принимаете данные, пришедшие с сервера, либо исключение. Т.е. опять поток GUI не ждет завершения удаленного вызова, как в случае вызова методов Begin/EndGetData у прокси.
При таком подходе удаленно вызывается только один метод, и нет никаких обратных вызовов!!! А это очень важно.
М>По моему он вообще не вызывает метод на сервере.
Считается, что для приложения вызов метода удаленного сервиса "прозрачен", хотя на самом деле летают пакеты.
М>Расскажите подробнее если можно, в чем тут может быть проблема? Может я чего-то простого не замечаю.
Кажется рассказал.