Реактивный фреймворк для .NET с примерами, доказывающими его полезность [закрыт]
-
20-09-2019 - |
Вопрос
Вокруг нового продукта поднялся настоящий ажиотаж. Реактивный Фреймворк в .NET 4.0.Хотя я думаю, что не понял его основной концепции, я не совсем уверен, что он настолько полезен.Можете ли вы привести хороший пример (который наполовину прост для понимания), который полностью демонстрирует мощь и полезность Rx?Покажите что-то, что делает жизнь намного проще, когда это делается с помощью Rx.
Решение
Вот краткий пример.Запрограммируйте операцию перетаскивания полностью декларативным образом, используя LINQ to event.
//Create an observable with the initial position and dragged points using LINQ to Events
var mouseDragPoints = from md in e.GetMouseDown()
let startpos=md.EventArgs.GetPosition(e)
from mm in e.GetMouseMove().Until(e.GetMouseUp())
select new
{
StartPos = startpos,
CurrentPos = mm.EventArgs.GetPosition(e),
};
И проведите линию от startpos до текущей позиции.
//Subscribe and draw a line from start position to current position
mouseDragPoints.Subscribe
(item =>
{
//Draw a line from item.Startpos to item.CurrentPos
}
);
Как видите, здесь нет ни обработчиков событий, ни логических переменных для управления состоянием.
Если вам интересны эти методы GetEventName(), я предлагаю вам прочитать всю эту статью, загрузить исходный код и поиграть с ним.
Другие советы
Недавно я написал пошаговую демонстрацию в своем блоге : http://blog.andrei.rinea.ro/2013/06/01/bing-it-on-reactive-extensions-story-code-and-slides/
По сути, я создаю небольшое приложение в WPF с помощью Rx и Bing Search:
Приложение подождет, пока вы перестанете печатать, а затем выполнит асинхронный поиск и представит результаты.Если до получения результатов вы введете другой поиск, существующий поиск будет автоматически удален.
Вы можете принудительно запустить поиск (чтобы пропустить время ожидания), нажав клавишу ENTER или кнопку "Перейти!", а также остановить текущий поиск, нажав кнопку Очистить.Есть индикатор занятости и некоторая обработка ошибок (например, на случай отключения сети).
Основные затронутые темы :
- Создание наблюдаемого объекта на основе события (TextChanged, Button.Click и т.д.)
- Асинхронный делегат (асинхронный поиск)
- Расширение takeUntil
- Расширение distinctUntilChanged (включая пользовательские значения)
- Расширение слияния
- Удлинитель дроссельной заслонки
- Расширение observeOn (для синхронизации потоков пользовательского интерфейса)
..и даже больше!