Здравствуйте, Максималист, Вы писали:
М>Доброго времени суток всем.
М>Есть клиент-серверное приложение устроенное следующим образом.
М>Есть интерфейс представляющий модель примерно такой (C#).
М>М>interface IModel
М>{
М> byte[] GetData();
М> IAsyncResult BeginGetData(AsyncCallback callback);
М> byte[] EndGetData(IAsyncResult ar);
М>}
М>
М>На клиентской стороне, его реализует прокси, которые ходит к серверу через Web-service.
М>На серверной стороне, его реализует класс ходящий к базе и содержащий, собственно, логику приложения.
о_О
Т.е. клиент синхронно вызывает метод BeginGetData на сервере? Занятно. Может быть в этом проблема?
М>Получается такая схема работы
М>1. Пользователь жмет кнопку на View (Windows forms)
М>2. View вызывает метод у Presenter-а, или, если хотите, Controllera.
М>3. Controller вызывает асинхронный метод IModel.BeginGetData( On_GetDataCompleted ). Никаких лишних потоков, все счастливы.
Нужно вызвать даленный метод GetData(), но асинхронно.
М>Теперь стоит задача, сделать Web(AJAX) клиента к этому приложению. Класс Controller-а переезжает на серверную сторону и начинает общаться с моделью через интерфейс IModel напрямую, без посредников. Теперь, когда приходит запрос из браузера, создается экземпляр View и он вызывает метод Controller-а. А Controller, как было написано выше, вызывыет асинхронный метод IModel.BeginGetData и создает еще один, абсолютно не нужный поток на сервере.
М>Вариантов решения видится несколько.
М>0. Переделываем Controller, чтобы он всегда вызывал синхронные методы IModel (по факту удаляем асинхронные методы из IModel). На Windows forms клиенте View вызывает методы Controller-а асинхронно (чтобы не вис GUI) и мы миримся с тем, что висит поток ожидающий ответа от сервера. На Web клиенте радуемся жизни.
Как вариант пойдет.
М>5. Какие еще методы решения данной проблемы вы предложите?
Убрать из IModel асинхронные методы как в 0. И завести в контроллере режим работы, чтобы на клиентской стороне он вызывал метод модели асинхронно, а на серверной -синхронно.
М>Какой бы метод решения выбрали вы? И если не сложно, напишите, почему.
Вот последний бы и выбрал. Ибо незачем в модели асинхронные методы + клиент не тупит + на сервере нет лишнего потока.
М>спасибо