Re[4]: Понятно ли такое описание архитектуры?
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 17.08.10 06:48
Оценка:
Здравствуйте, gandjustas, Вы писали:

S>>И AsyncQueryRecievedCallback будет вызываться асинхронно? Я все правильно написал? И вообще, нужен ли здесь RX если изначально в классе Client будет асинхронная работа с сокетами и callback так и так позовется асинхронно?


G>Основное преимущество Rx не в асинхронности (это как раз легко делается), а в том что такие асинхронные потоки можно обрабатывать с помощью комбинаторов и Linq (читай работают замыкания).


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

В статье по RX приводится классический пример с drag&drop, когда из серий сообщений MouseMove,MouseDown и MouseUp генерируется серия MouseMove между нажатием кнопки и её опусканием. То есть, если мне надо будет пропускать сообщения или как-то агрегировать разные потоки — то да, это может иметь смысл. Но у меня протокол запрос-ответ, то есть серверу надо персонально ответить каждому клиенту или спросить каждого клиента. Не вижу тут преимуществ от использования RX и Linq.

Извините, если слишком занудствую, хочется разобраться
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[5]: Понятно ли такое описание архитектуры?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.08.10 07:05
Оценка: 6 (1)
Здравствуйте, Sshur, Вы писали:

S>Здравствуйте, gandjustas, Вы писали:


S>>>И AsyncQueryRecievedCallback будет вызываться асинхронно? Я все правильно написал? И вообще, нужен ли здесь RX если изначально в классе Client будет асинхронная работа с сокетами и callback так и так позовется асинхронно?


G>>Основное преимущество Rx не в асинхронности (это как раз легко делается), а в том что такие асинхронные потоки можно обрабатывать с помощью комбинаторов и Linq (читай работают замыкания).


S>Я понимаю, что для получившейся коллекции сообщений становится возможным использовать линк, чтобы например получить последнее сообщение или найти разницу между двумя последовательностями, все что можно делать с обычными коллекциями


S>В статье по RX приводится классический пример с drag&drop, когда из серий сообщений MouseMove,MouseDown и MouseUp генерируется серия MouseMove между нажатием кнопки и её опусканием. То есть, если мне надо будет пропускать сообщения или как-то агрегировать разные потоки — то да, это может иметь смысл. Но у меня протокол запрос-ответ, то есть серверу надо персонально ответить каждому клиенту или спросить каждого клиента. Не вижу тут преимуществ от использования RX и Linq.


S>Извините, если слишком занудствую, хочется разобраться


1)Откуда берется запрос? Вероятнее всего является реакцией на пользовательское событие (нажатие кнопки)
2)Куда девается ответ? Вероятнее всего как-то выводится на интерфейс пользователя.

С помощью Rx все эти подробности можно описать в одном месте, причем везде будет доступен контекст.

Примерно так (почти псевдокод)

var q = from ea in Observable.FromEvent(btn,"Click")
        from r in _service.GetResponse(PrepareRequest(ea))
        select new { Button = ea.Sender as Button, Response = ProcessResponse(r)};
var cookie = q.ObserveOn(/*Form*/this).Subscribe(p => {...});


Попробуй для разминки сделать подобное на событиях или коллбеках.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.