SlideShare une entreprise Scribd logo
1  sur  38
Реактивные расширения
     для чайников
                       Сергей Звягин
                  Ingate Development
           Специально для GetDev.NET
Реактивное программирование
• Реактивное программирование — парадигма
  программирования, ориентированная на потоки
  данных и распространение изменений. Это
  означает, что должна существовать возможность
  легко выражать статические и динамические
  потоки данных, а также то, что выполняемая
  модель должна автоматически распространять
  изменения сквозь поток данных.

http://ru.wikipedia.org/wiki/Реактивное_программирование
Push и Pull
• Существует 2 подхода обработки
  последовательности данных
• При push-подходе цель запрашивает у
  источника содержимое
• При pull-подходе источник информирует
  цель о наличии данных
Push-подход
• Чтение из файла
• Суммирования элементов массива
• Обработка выборки из БД
Pull-подход
•   Обработка действий пользователя
•   Получение данных от веб-сервиса
•   Таймеры
•   Анимация пользовательского интерфейса
Push-подход
• Push-коллекции в .NET реализуются с
  использованием интерфейсов IEnumerable<T>
  и IEnumerator<T>
• Это могут быть коллекции в памяти
  (списки, массивы), бесконечные
  последовательности (генераторы) или наборы
  данных с неизвестным заранее размером
  (выборка из БД)
• LINQ позволяет быстро организовать работу с
  такими коллекциями
Pull-подход
•   События и делегаты
•   Асинхронные методы BeginXXXX и EndXXXX
•   async/await
•   Сторонние реализации
•   Да и зачем тут LINQ?
Типичные задачи
• Как обработать двойной клик?
• А тройной клик?
• Как проверять орфографию в
  словах, которые вводит пользователь в
  поле?
• Когда делать запросы в базу при
  реализации элемента управления «живой
  поиск»?
Pull-подход
• В .NET 4 появилось 2 новых интерфейса,
  реализующих pull-подход - IObservable<T> и
  IObserver<T>
Простой пример
• Push-коллекция




• Pull-коллекция
.NET Rx сборки
•   System.CoreEx
•   System.Interactive
•   System.Observable
•   System.Reactive
•   System.Threading
Реактивные расширения
• Представление асинхронных потоков
  данных как Observable
• Формирование запросов с помощью LINQ
• Параметризация конкурентных
  асинхронных потоков с помощью
  Schedulers
• Rx = Observables + LINQ + Schedulers
Операторы LINQ
•   Примитивы
•   Создание последовательностей
•   Конвертация
•   Комбинация
•   Математические операции
•   Временные операции
•   Фильтрация и выбор
•   Обработка исключений
•   Функциональные операции
•   Специальные операции
Примитивы
•   Never
•   Empty
•   Return
•   Throw
Создание последовательностей
•   Create
•   Generate
•   Defer
•   Range
Конвертация
•   FromAsyncPattern
•   FromEvent
•   FromEventPattern
•   ToObservable
•   ToEnumerable
Комбинация
•   Amb
•   Concat
•   StartWith
•   Merge
•   Repeat
•   Zip
Математические операции
•   Aggregate
•   Count
•   Min
•   Max
•   Sum
Временные операции
•   Delay
•   Interval
•   TimeInterval
•   Timestamp
•   Timeout
Фильтрация и выбор
•   Take
•   TakeUntil/TakeWhile
•   Select
•   SelectMany
•   Skip
•   SkipUntil/SkipWhile
Обработка исключений
•   Catch
•   Finally
•   Retry
•   OnErrorResumeNext
Функциональные операции
•   Let
•   Prune
•   Publish
•   Replay
Специальные операции
• Do
• Run
• Remotable
Многопоточность
• В каком потоке будет обрабатываться
  результирующая функция?
  – В текущем потоке
  – В новом потоке
  – В тредпуле
  – В потоке интерфейса
Schedulers
• Для управления конкурентными
  асинхронными потоками используются
  объекты, реализующие интерфейс
  IScheduler
• По умолчанию используется наиболее
  подходящий Scheduler
• Можно принудительно указать, какой
  Scheduler будет использоваться в
  конкретном случае
Scheduler по умолчанию
• Небольшое количество событий –
  ImmediateScheduler
• Большое или неопределенное количество
  событий – CurrentThreadScheduler
• При использовании таймеров -
  ThreadPoolScheduler
Использование 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(…);
Пример запроса
Observable.FromEvent<TextChangedEventArgs>
 (searchTextBox, "TextChanged")
 .Select(e => ((TextBox)e.Sender).Text)
 .Where(text => text.Length > 2)
 .Do(s => searchResults.Opacity = 0.5)
 .Throttle(TimeSpan.FromMilliseconds(400))
 .ObserveOnDispatcher()
 .Do(s => Indicator.Visibility = Visibility.Visible)
 .SelectMany(txt => searchTwitter(txt))
 .Select(searchRes => ParseTwitterSearch(searchRes))
 .ObserveOnDispatcher()
 .Do(s => Indicator.Visibility = Visibility.Collapsed)
 .Do(s => searchResults.Opacity = 1)
 .Subscribe(tweets => searchResults.ItemsSource = tweets);
Где можно использовать?
•   .NET Framework 3.5 SP1
•   .NET Framework 4
•   Silverlight 4
•   Silverlight 5
•   Windows Phone 7
•   Windows Phone 7.1 “Mango”
•   .NET Framework 4.5 + WinRT (Experimental)
•   JavaScript
JavaScript
• Библиотека RxJS доступна в
  экспериментальной версии
• Логика работы повторяет логику Rx .NET
• Bridges – дополнительные конвертеры
Bridges
• FromDOMEvent

var canvas =
  document.getElementById("canvas");
var source =
  Rx.Observable.FromDOMEvent(canvas, "mousemove");

source.Subscribe(function(ev) {
  // Handle the mousemove event here
});
Bridges
• FromJQuery

Rx.Observable.FromJQuery($("div, span"), "click")
  .Subscribe(function(evt) {
    $("position").html("Mouse at " + evt.pageX +
                              ", " + evt.pageY);
  });
Bridges
• XmlHttpRequest
function searchWikipedia(term) {
  var url = "http://en.wikipedia.org/w/api.php" +
            "?action=opensearch&search=" + term +
            "&format=json";

    return Rx.Observable.XmlHttpRequest(url)
             .Select(function(result) {
                 var response = eval(result.responseText);
                 if (response.length == 2) return response[1];
                 else return [];
             });
}
Пример запроса
var input = $("#searchInput");
var words = input.ToObservable("keyup")
  .Select(function(_) { return input.val(); })
  .Throttle(500)
  .DistinctUntilChanged()
  .Select(function(term) { return search(term); })
  .Switch();
words.Subscribe(function(data) {
  $("#results").empty();
  $.each(data, function(_, value) {
    $("#results").append("<li>" + value + "</li>");
  }
});
На этом всё…
ВОПРОСЫ?
Полезные ссылки
• Reactive Extensions Developer Center
  http://msdn.microsoft.com/en-
  us/data/gg577609
• Reactive Framework Wiki
  http://rxwiki.wikidot.com/
• Rx Team Blog
  http://blogs.msdn.com/b/rxteam/
• Скачать Rx http://msdn.microsoft.com/en-
  us/data/gg577610
Следующая встреча
Спасибо за внимание!
    Если будут ещё вопросы – пишите!
    Сергей Звягин, Ingate Development
    • E-mail: bingofirst@gmail.com
    • Twitter: @Bingo87
    • Xbox: BingoRUS

Специально для GetDev.NET

Contenu connexe

Tendances

Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Ilyas Salikhov
 
Живые приложения с Rx
Живые приложения с RxЖивые приложения с Rx
Живые приложения с Rx
GoSharp
 
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Ontico
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.js
Serge Shirokov
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Ontico
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
 

Tendances (20)

Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
Pinboard + pinba / Как организовать мониторинг сотни PHP-проектов (Devconf 2014)
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
 
Живые приложения с Rx
Живые приложения с RxЖивые приложения с Rx
Живые приложения с Rx
 
What's in a metrics? Ruby Russia 2018
What's in a metrics? Ruby Russia 2018What's in a metrics? Ruby Russia 2018
What's in a metrics? Ruby Russia 2018
 
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
Мифы и легенды Java Stream API
Мифы и легенды Java Stream APIМифы и легенды Java Stream API
Мифы и легенды Java Stream API
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
Типичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.jsТипичный стек технологий для использования с Node.js
Типичный стек технологий для использования с Node.js
 
PowerShell
PowerShellPowerShell
PowerShell
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
 
Пишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данныхПишем самый быстрый хеш для кэширования данных
Пишем самый быстрый хеш для кэширования данных
 
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
Доклад Антона Поварова на Tarantool Meetup. "Tarantool в Badoo: хранение исто...
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Сергей Константинов — Простая обработка групп геообъектов на карте
Сергей Константинов — Простая обработка групп геообъектов на картеСергей Константинов — Простая обработка групп геообъектов на карте
Сергей Константинов — Простая обработка групп геообъектов на карте
 
Underscore js
Underscore jsUnderscore js
Underscore js
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 

En vedette

En vedette (20)

Erlang
ErlangErlang
Erlang
 
Менеджер пакетов NuGet
Менеджер пакетов NuGetМенеджер пакетов NuGet
Менеджер пакетов NuGet
 
Видео в сети
Видео в сетиВидео в сети
Видео в сети
 
Что нового в Visual Studio 2015
Что нового в Visual Studio 2015Что нового в Visual Studio 2015
Что нового в Visual Studio 2015
 
Windows communication foundation 4
Windows communication foundation 4Windows communication foundation 4
Windows communication foundation 4
 
jQuery как путь к RIA
jQuery как путь к RIAjQuery как путь к RIA
jQuery как путь к RIA
 
C# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущееC# 5.0. Взгляд в будущее
C# 5.0. Взгляд в будущее
 
Kh21345
Kh21345Kh21345
Kh21345
 
Workflow Foundation
Workflow FoundationWorkflow Foundation
Workflow Foundation
 
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКPhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
 
XAML - язык разметки приложений
XAML - язык разметки приложенийXAML - язык разметки приложений
XAML - язык разметки приложений
 
WinRT
WinRTWinRT
WinRT
 
ASP.NET MVC 4
ASP.NET MVC 4ASP.NET MVC 4
ASP.NET MVC 4
 
Introduction to Azure AppFabric
Introduction to Azure AppFabricIntroduction to Azure AppFabric
Introduction to Azure AppFabric
 
NoSQL databases and CouchDB
NoSQL databases and CouchDBNoSQL databases and CouchDB
NoSQL databases and CouchDB
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVC
 
Async Javascript
Async JavascriptAsync Javascript
Async Javascript
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Lego Mindstorms
Lego MindstormsLego Mindstorms
Lego Mindstorms
 
Windows Azure platform
Windows Azure platformWindows Azure platform
Windows Azure platform
 

Similaire à Reactive Extensions

Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
Regn
 
Observable как атом приложения
Observable как атом приложенияObservable как атом приложения
Observable как атом приложения
Artem Bey
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
Andrew Mayorov
 
Big Data - первые шаги
Big Data - первые шагиBig Data - первые шаги
Big Data - первые шаги
Anton Gorokhov
 
MySQL для высоконагруженных проектов
MySQL для высоконагруженных проектовMySQL для высоконагруженных проектов
MySQL для высоконагруженных проектов
Softline
 

Similaire à Reactive Extensions (20)

Rx
RxRx
Rx
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Power of LINQ
Power of LINQPower of LINQ
Power of LINQ
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 
Observable как атом приложения
Observable как атом приложенияObservable как атом приложения
Observable как атом приложения
 
Tarantool, .net, newsql
Tarantool, .net, newsqlTarantool, .net, newsql
Tarantool, .net, newsql
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
Компонентная среда разработки инструментария нагрузочного тестирования
Компонентная среда разработки инструментария нагрузочного тестированияКомпонентная среда разработки инструментария нагрузочного тестирования
Компонентная среда разработки инструментария нагрузочного тестирования
 
RESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentationRESTful API: Best practices, versioning, design documentation
RESTful API: Best practices, versioning, design documentation
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipes
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Coding like a sex
Coding like a sexCoding like a sex
Coding like a sex
 
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
 
Big Data - первые шаги
Big Data - первые шагиBig Data - первые шаги
Big Data - первые шаги
 
Иван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программированиеИван Пузыревский — Введение в асинхронное программирование
Иван Пузыревский — Введение в асинхронное программирование
 
MySQL для высоконагруженных проектов
MySQL для высоконагруженных проектовMySQL для высоконагруженных проектов
MySQL для высоконагруженных проектов
 
Новости Global summit 2015
Новости Global summit 2015Новости Global summit 2015
Новости Global summit 2015
 

Plus de GetDev.NET

Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
GetDev.NET
 
Обзор рекомендаций W3C
Обзор рекомендаций W3CОбзор рекомендаций W3C
Обзор рекомендаций W3C
GetDev.NET
 

Plus de GetDev.NET (20)

Go
GoGo
Go
 
Leap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущееLeap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущее
 
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов
 
Mind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучшеMind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучше
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революция
 
Windows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиковWindows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиков
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
 
Что нового в Visual Studio 2013
Что нового в Visual Studio 2013Что нового в Visual Studio 2013
Что нового в Visual Studio 2013
 
AngularJS
AngularJSAngularJS
AngularJS
 
TypeScript
TypeScriptTypeScript
TypeScript
 
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
 
Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8
 
JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработки
 
Roslyn - компилятор как сервис
Roslyn - компилятор как сервисRoslyn - компилятор как сервис
Roslyn - компилятор как сервис
 
Обзор рекомендаций W3C
Обзор рекомендаций W3CОбзор рекомендаций W3C
Обзор рекомендаций W3C
 
Первое знакомство с MODx revolution
Первое знакомство с MODx revolutionПервое знакомство с MODx revolution
Первое знакомство с MODx revolution
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
Microsoft NUI - Surface
Microsoft NUI - SurfaceMicrosoft NUI - Surface
Microsoft NUI - Surface
 
Microsoft NUI - Kinect
Microsoft NUI - KinectMicrosoft NUI - Kinect
Microsoft NUI - Kinect
 

Reactive Extensions

  • 1. Реактивные расширения для чайников Сергей Звягин Ingate Development Специально для GetDev.NET
  • 2. Реактивное программирование • Реактивное программирование — парадигма программирования, ориентированная на потоки данных и распространение изменений. Это означает, что должна существовать возможность легко выражать статические и динамические потоки данных, а также то, что выполняемая модель должна автоматически распространять изменения сквозь поток данных. http://ru.wikipedia.org/wiki/Реактивное_программирование
  • 3. Push и Pull • Существует 2 подхода обработки последовательности данных • При push-подходе цель запрашивает у источника содержимое • При pull-подходе источник информирует цель о наличии данных
  • 4. Push-подход • Чтение из файла • Суммирования элементов массива • Обработка выборки из БД
  • 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>
  • 11. .NET Rx сборки • System.CoreEx • System.Interactive • System.Observable • System.Reactive • System.Threading
  • 12. Реактивные расширения • Представление асинхронных потоков данных как Observable • Формирование запросов с помощью LINQ • Параметризация конкурентных асинхронных потоков с помощью Schedulers • Rx = Observables + LINQ + Schedulers
  • 13. Операторы LINQ • Примитивы • Создание последовательностей • Конвертация • Комбинация • Математические операции • Временные операции • Фильтрация и выбор • Обработка исключений • Функциональные операции • Специальные операции
  • 14. Примитивы • Never • Empty • Return • Throw
  • 15. Создание последовательностей • Create • Generate • Defer • Range
  • 16. Конвертация • FromAsyncPattern • FromEvent • FromEventPattern • ToObservable • ToEnumerable
  • 17. Комбинация • Amb • Concat • StartWith • Merge • Repeat • Zip
  • 18. Математические операции • Aggregate • Count • Min • Max • Sum
  • 19. Временные операции • Delay • Interval • TimeInterval • Timestamp • Timeout
  • 20. Фильтрация и выбор • Take • TakeUntil/TakeWhile • Select • SelectMany • Skip • SkipUntil/SkipWhile
  • 21. Обработка исключений • Catch • Finally • Retry • OnErrorResumeNext
  • 22. Функциональные операции • Let • Prune • Publish • Replay
  • 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(…);
  • 28. Пример запроса Observable.FromEvent<TextChangedEventArgs> (searchTextBox, "TextChanged") .Select(e => ((TextBox)e.Sender).Text) .Where(text => text.Length > 2) .Do(s => searchResults.Opacity = 0.5) .Throttle(TimeSpan.FromMilliseconds(400)) .ObserveOnDispatcher() .Do(s => Indicator.Visibility = Visibility.Visible) .SelectMany(txt => searchTwitter(txt)) .Select(searchRes => ParseTwitterSearch(searchRes)) .ObserveOnDispatcher() .Do(s => Indicator.Visibility = Visibility.Collapsed) .Do(s => searchResults.Opacity = 1) .Subscribe(tweets => searchResults.ItemsSource = tweets);
  • 29. Где можно использовать? • .NET Framework 3.5 SP1 • .NET Framework 4 • Silverlight 4 • Silverlight 5 • Windows Phone 7 • Windows Phone 7.1 “Mango” • .NET Framework 4.5 + WinRT (Experimental) • JavaScript
  • 30. JavaScript • Библиотека RxJS доступна в экспериментальной версии • Логика работы повторяет логику Rx .NET • Bridges – дополнительные конвертеры
  • 31. Bridges • FromDOMEvent var canvas = document.getElementById("canvas"); var source = Rx.Observable.FromDOMEvent(canvas, "mousemove"); source.Subscribe(function(ev) { // Handle the mousemove event here });
  • 32. Bridges • FromJQuery Rx.Observable.FromJQuery($("div, span"), "click") .Subscribe(function(evt) { $("position").html("Mouse at " + evt.pageX + ", " + evt.pageY); });
  • 33. Bridges • XmlHttpRequest function searchWikipedia(term) { var url = "http://en.wikipedia.org/w/api.php" + "?action=opensearch&search=" + term + "&format=json"; return Rx.Observable.XmlHttpRequest(url) .Select(function(result) { var response = eval(result.responseText); if (response.length == 2) return response[1]; else return []; }); }
  • 34. Пример запроса var input = $("#searchInput"); var words = input.ToObservable("keyup") .Select(function(_) { return input.val(); }) .Throttle(500) .DistinctUntilChanged() .Select(function(term) { return search(term); }) .Switch(); words.Subscribe(function(data) { $("#results").empty(); $.each(data, function(_, value) { $("#results").append("<li>" + value + "</li>"); } });
  • 36. Полезные ссылки • Reactive Extensions Developer Center http://msdn.microsoft.com/en- us/data/gg577609 • Reactive Framework Wiki http://rxwiki.wikidot.com/ • Rx Team Blog http://blogs.msdn.com/b/rxteam/ • Скачать Rx http://msdn.microsoft.com/en- us/data/gg577610
  • 38. Спасибо за внимание! Если будут ещё вопросы – пишите! Сергей Звягин, Ingate Development • E-mail: bingofirst@gmail.com • Twitter: @Bingo87 • Xbox: BingoRUS Специально для GetDev.NET