Reactive Extensions

6,432 views

Published on

Введение в реактивные расширения.
Видео доклада: http://getdev.net/Event/reactive-extensions

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,432
On SlideShare
0
From Embeds
0
Number of Embeds
3,353
Actions
Shares
0
Downloads
18
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Reactive Extensions

  1. 1. Реактивные расширения для чайников Сергей Звягин Ingate Development Специально для GetDev.NET
  2. 2. Реактивное программирование• Реактивное программирование — парадигма программирования, ориентированная на потоки данных и распространение изменений. Это означает, что должна существовать возможность легко выражать статические и динамические потоки данных, а также то, что выполняемая модель должна автоматически распространять изменения сквозь поток данных.http://ru.wikipedia.org/wiki/Реактивное_программирование
  3. 3. Push и Pull• Существует 2 подхода обработки последовательности данных• При push-подходе цель запрашивает у источника содержимое• При pull-подходе источник информирует цель о наличии данных
  4. 4. Push-подход• Чтение из файла• Суммирования элементов массива• Обработка выборки из БД
  5. 5. Pull-подход• Обработка действий пользователя• Получение данных от веб-сервиса• Таймеры• Анимация пользовательского интерфейса
  6. 6. Push-подход• Push-коллекции в .NET реализуются с использованием интерфейсов IEnumerable<T> и IEnumerator<T>• Это могут быть коллекции в памяти (списки, массивы), бесконечные последовательности (генераторы) или наборы данных с неизвестным заранее размером (выборка из БД)• LINQ позволяет быстро организовать работу с такими коллекциями
  7. 7. Pull-подход• События и делегаты• Асинхронные методы BeginXXXX и EndXXXX• async/await• Сторонние реализации• Да и зачем тут LINQ?
  8. 8. Типичные задачи• Как обработать двойной клик?• А тройной клик?• Как проверять орфографию в словах, которые вводит пользователь в поле?• Когда делать запросы в базу при реализации элемента управления «живой поиск»?
  9. 9. Pull-подход• В .NET 4 появилось 2 новых интерфейса, реализующих pull-подход - IObservable<T> и IObserver<T>
  10. 10. Простой пример• Push-коллекция• Pull-коллекция
  11. 11. .NET Rx сборки• System.CoreEx• System.Interactive• System.Observable• System.Reactive• System.Threading
  12. 12. Реактивные расширения• Представление асинхронных потоков данных как Observable• Формирование запросов с помощью LINQ• Параметризация конкурентных асинхронных потоков с помощью Schedulers• Rx = Observables + LINQ + Schedulers
  13. 13. Операторы LINQ• Примитивы• Создание последовательностей• Конвертация• Комбинация• Математические операции• Временные операции• Фильтрация и выбор• Обработка исключений• Функциональные операции• Специальные операции
  14. 14. Примитивы• Never• Empty• Return• Throw
  15. 15. Создание последовательностей• Create• Generate• Defer• Range
  16. 16. Конвертация• FromAsyncPattern• FromEvent• FromEventPattern• ToObservable• ToEnumerable
  17. 17. Комбинация• Amb• Concat• StartWith• Merge• Repeat• Zip
  18. 18. Математические операции• Aggregate• Count• Min• Max• Sum
  19. 19. Временные операции• Delay• Interval• TimeInterval• Timestamp• Timeout
  20. 20. Фильтрация и выбор• Take• TakeUntil/TakeWhile• Select• SelectMany• Skip• SkipUntil/SkipWhile
  21. 21. Обработка исключений• Catch• Finally• Retry• OnErrorResumeNext
  22. 22. Функциональные операции• Let• Prune• Publish• Replay
  23. 23. Специальные операции• Do• Run• Remotable
  24. 24. Многопоточность• В каком потоке будет обрабатываться результирующая функция? – В текущем потоке – В новом потоке – В тредпуле – В потоке интерфейса
  25. 25. Schedulers• Для управления конкурентными асинхронными потоками используются объекты, реализующие интерфейс IScheduler• По умолчанию используется наиболее подходящий Scheduler• Можно принудительно указать, какой Scheduler будет использоваться в конкретном случае
  26. 26. Scheduler по умолчанию• Небольшое количество событий – ImmediateScheduler• Большое или неопределенное количество событий – CurrentThreadScheduler• При использовании таймеров - ThreadPoolScheduler
  27. 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. 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. 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. 30. JavaScript• Библиотека RxJS доступна в экспериментальной версии• Логика работы повторяет логику Rx .NET• Bridges – дополнительные конвертеры
  31. 31. Bridges• FromDOMEventvar canvas = document.getElementById("canvas");var source = Rx.Observable.FromDOMEvent(canvas, "mousemove");source.Subscribe(function(ev) { // Handle the mousemove event here});
  32. 32. Bridges• FromJQueryRx.Observable.FromJQuery($("div, span"), "click") .Subscribe(function(evt) { $("position").html("Mouse at " + evt.pageX + ", " + evt.pageY); });
  33. 33. Bridges• XmlHttpRequestfunction 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. 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>"); }});
  35. 35. На этом всё…ВОПРОСЫ?
  36. 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
  37. 37. Следующая встреча
  38. 38. Спасибо за внимание! Если будут ещё вопросы – пишите! Сергей Звягин, Ingate Development • E-mail: bingofirst@gmail.com • Twitter: @Bingo87 • Xbox: BingoRUSСпециально для GetDev.NET

×