Re: Web клиент для существующего приложения (прикладной вопр
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.02.09 18:06
Оценка:
Здравствуйте, Максималист, Вы писали:

М>Доброго времени суток всем.


М>Есть клиент-серверное приложение устроенное следующим образом.


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

М>Какой бы метод решения выбрали вы? И если не сложно, напишите, почему.

Вот последний бы и выбрал. Ибо незачем в модели асинхронные методы + клиент не тупит + на сервере нет лишнего потока.

М>спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.