1. Реактивные расширения
для чайников
Сергей Звягин
Ingate Development
Специально для GetDev.NET
2. Реактивное программирование
• Реактивное программирование — парадигма
программирования, ориентированная на потоки
данных и распространение изменений. Это
означает, что должна существовать возможность
легко выражать статические и динамические
потоки данных, а также то, что выполняемая
модель должна автоматически распространять
изменения сквозь поток данных.
http://ru.wikipedia.org/wiki/Реактивное_программирование
3. Push и Pull
• Существует 2 подхода обработки
последовательности данных
• При push-подходе цель запрашивает у
источника содержимое
• При pull-подходе источник информирует
цель о наличии данных
5. Pull-подход
• Обработка действий пользователя
• Получение данных от веб-сервиса
• Таймеры
• Анимация пользовательского интерфейса
6. Push-подход
• Push-коллекции в .NET реализуются с
использованием интерфейсов IEnumerable<T>
и IEnumerator<T>
• Это могут быть коллекции в памяти
(списки, массивы), бесконечные
последовательности (генераторы) или наборы
данных с неизвестным заранее размером
(выборка из БД)
• LINQ позволяет быстро организовать работу с
такими коллекциями
7. Pull-подход
• События и делегаты
• Асинхронные методы BeginXXXX и EndXXXX
• async/await
• Сторонние реализации
• Да и зачем тут LINQ?
8. Типичные задачи
• Как обработать двойной клик?
• А тройной клик?
• Как проверять орфографию в
словах, которые вводит пользователь в
поле?
• Когда делать запросы в базу при
реализации элемента управления «живой
поиск»?
9. Pull-подход
• В .NET 4 появилось 2 новых интерфейса,
реализующих pull-подход - IObservable<T> и
IObserver<T>
12. Реактивные расширения
• Представление асинхронных потоков
данных как Observable
• Формирование запросов с помощью LINQ
• Параметризация конкурентных
асинхронных потоков с помощью
Schedulers
• Rx = Observables + LINQ + Schedulers
13. Операторы LINQ
• Примитивы
• Создание последовательностей
• Конвертация
• Комбинация
• Математические операции
• Временные операции
• Фильтрация и выбор
• Обработка исключений
• Функциональные операции
• Специальные операции
24. Многопоточность
• В каком потоке будет обрабатываться
результирующая функция?
– В текущем потоке
– В новом потоке
– В тредпуле
– В потоке интерфейса
25. Schedulers
• Для управления конкурентными
асинхронными потоками используются
объекты, реализующие интерфейс
IScheduler
• По умолчанию используется наиболее
подходящий Scheduler
• Можно принудительно указать, какой
Scheduler будет использоваться в
конкретном случае
26. Scheduler по умолчанию
• Небольшое количество событий –
ImmediateScheduler
• Большое или неопределенное количество
событий – CurrentThreadScheduler
• При использовании таймеров -
ThreadPoolScheduler
27. Использование Scheduler
• Используются статические свойства класса
System.Reactive.Concurrency.Scheduler
• Указать Scheduler можно либо параметром
в перегруженном методе оператора
Observable.Timer(Timespan.FromSeconds(0.01), Sched
uler.DispatcherScheduler).Subscribe(…);
• Либо с использованием специального
оператора ObserveOn
Observable.Timer(Timespan.FromSeconds(0.01))
.ObserveOn(Scheduler.DispatcherScheduler)
.Subscribe(…);
38. Спасибо за внимание!
Если будут ещё вопросы – пишите!
Сергей Звягин, Ingate Development
• E-mail: bingofirst@gmail.com
• Twitter: @Bingo87
• Xbox: BingoRUS
Специально для GetDev.NET