Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Альтернатива событиям при запросе данных?


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

Первый:
Для общения используются асинхронные методы класса 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;
    });
}


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

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

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

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

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

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

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

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

Принципиальная разница таки есть, и она заключается в удобстве использования.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)