Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Альтернатива событиям при запросе данных? 
:(
    Опции темы
ababab
Дата 18.5.2012, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.4.2011

Репутация: нет
Всего: нет



Здравствуйте.
Имеется клиентское дотнет-приложение, которое общается по сети с джава-сервером для получения данных.
Использоваться веб-сервисы невозможно, т.к. на джава-сервере они не реализованы.
Ниже описано два подхода к взаимодействию по сети. 
Вопрос темы в том, какой из них лучше.
извиняюсь за простыню, не нашел спойлеров

Первый:
Для общения используются асинхронные методы класса WebClient.
Примерный метод получения данных выглядит следующим образом:
Код

pulbic class DataService{
    public void Get(){
        var client = new WebClient();
        client.DownloadStringAsync(uri);
        client.DownloadStringCompleted+=(s,ea)=>{
            if (ea.error != null) 
                RaiseGetCompleted(ea.result);
            else
                MessageBox.show(ea.error);
        };
    }

    public event EventHandler<SomeData> GetCompleted;
    private void RaiseGetCompleted(...) {...}
}

Пример использования:
Код

public void GetData(){
    var service = new DataService();
    service.Get();
    service.Got+=(s,ea)=>{
        var data = ea.Data; 
    };
}

Этот подход не устроил из-за неудобства работы с дотнетовскими событиями: 
1) необходимость возвращать объект данных, наследованный от EventArgs;
2) использование статики в DataService сильно усложняет код;
3) нужно постоянно привязываться/отвязываться от события;
4) при этом нет жесткой связи между методом Get и событием Got;
5) при множестве запросов и множестве ответов, нужно ставить в соответствие запросу ответ — использовать некие ID или UserState для различения ответов;

Второй:
Примерный метод получения данных:
Код

public static class DataService{
    public static void Get(Action<SomeData> callback){
        var client = new WebClient();
        client.DownloadStringAsync(uri);
        client.DownloadStringCompleted+=(s,ea)=>{
            if (ea.error != null)
                callback(ea.Result)
            else
                MessageBox.show(ea.error);
        }
    }
}

Пример использования:
Код

public void GetData(){
    DataService.GetData(response=>{
        var data = response;
    });
}


Вопрос: чем второй подход может быть хуже первого?

Насколько я понимаю, это не совсем стандартный способ реализации метода получения данных, т.к. их, скорее всего, реализуют на событиях.

В данный момент используется второй подход.
В чем могут быть недостатки такого подхода в долгосрочной перспективе?
PM MAIL   Вверх
eugene123
Дата 23.5.2012, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 1.8.2011

Репутация: нет
Всего: нет



Не понятно чем не устроила событийная модель дотнета. По-моему, очень все удачно и логично реализовано. Наверно, тут подходит пословица про плохого танцора...
В любом случае, если не устраивают асинхронные методы (которые в любом фреймворке основаны на событиях), используй их синхронные аналоги (i. e. WebClient.DownloadString(Uri))

А в приведенных выше двух подходах принципиальной разницы нет вообще, есть только различие в рюшках сишарпа

PM MAIL   Вверх
ababab
Дата 25.5.2012, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 29.4.2011

Репутация: нет
Всего: нет



Цитата(eugene123 @ 23.5.2012,  14:41)
Не понятно чем не устроила событийная модель дотнета. По-моему, очень все удачно и логично реализовано. Наверно, тут подходит пословица про плохого танцора...
В любом случае, если не устраивают асинхронные методы (которые в любом фреймворке основаны на событиях), используй их синхронные аналоги (i. e. WebClient.DownloadString(Uri))

А в приведенных выше двух подходах принципиальной разницы нет вообще, есть только различие в рюшках сишарпа

В данном конкретном случае с событийной моделью дотнета работать неудобно.
Насчет танцора - отличный аргумент по делу.
Синхронные методы не доступны, т.к. это Silverlight-приложение.

Принципиальная разница таки есть, и она заключается в удобстве использования.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0627 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.