Реактивные расширения C#

Preview:

DESCRIPTION

Реактивные расширения C#. Вомпе Федор c тудент -партнер Microsoft. vompe@physics.msu.ru Twitter: @ qosys Блог : http://b.qosys.info/. Что такое “ реактивные расширения ”. - PowerPoint PPT Presentation

Citation preview

Microsoft TechDayshttp://www.techdays.ru

Реактивные расширения C#Вомпе Федорcтудент-партнер Microsoft

vompe@physics.msu.ruTwitter: @qosysБлог: http://b.qosys.info/

Microsoft TechDayshttp://www.techdays.ru

Что такое “реактивные расширения”

Reactive Extensions(Rx), “реактивные расширения” – набор LINQ-расширений .NET(C#), упрощающих работу с асинхронными вычислениями и вычислениями на базе событий

Другое название LINQ to Rx(John Skeet), LINQ to EventsПлатформы - .NET 3.5 и 4.0, Silverlight 3 и 4, JavaScript, WP7, XNA 3.1 и 4.0Rx доступна через NuGet

Microsoft TechDayshttp://www.techdays.ru

Rx-библиотеки

stable - v1.0.10425, experimental - v1.1.10425

Microsoft TechDayshttp://www.techdays.ru

Пример: выпадающая подсказка(suggest)

пример из Rx Design Guidelines

Microsoft TechDayshttp://www.techdays.ru

IEnumerable<T>Cуществующий интерфейс IEnumerable<T> используется для создания последовательностей из объектов

Получаемые последовательности – pull-последовательности, т.к. предоставляют свое содержимое по запросу, MoveNext() :

GetEnumerator() -> MoveNext() -> MoveNext() .... -> MoveNext() -> break

Microsoft TechDayshttp://www.techdays.ru

Пример IEnumerable<T> последовательностиIEnumerable<int> NaturalNumbers(){ int number = 0; while(true) { number++; yield return number; //yield! }}

...

foreach(var num in NaturalNumbers()) PrintSquares(num);

Microsoft TechDayshttp://www.techdays.ru

Идея реактивных расширенийА что если LINQ использовать для событий и отложенных вычислений? (Как и для перечислимых IEnumerable последовательностей?)

В .NET есть паттерн наблюдатель[Observer, GoF, p293] для создания цепочки связанных событий – интерфейсы IObservable<T>, IObserver<T>

http://www.vincehuston.org/dp/observer.html

Microsoft TechDayshttp://www.techdays.ru

IObservable<T>

Пара IObservable<>/IObserver<> дуальна паре IEnumerable<>/ IEnumerator<>

Вместо pull-коллекций выступают push-коллекции

Microsoft TechDayshttp://www.techdays.ru

Pull vs Push

Источник(Source) Цель(Target)

PULL

PUSH

PULL – Цели необходимо потребовать данныеPUSH – Источник предупреждает цель когда есть данные

Microsoft TechDayshttp://www.techdays.ru

Rx: метод Subscribe<>

Свой класс Observer можно не создавать(использование обычного Subscribe), вместо этого можно использовать extension-метод Rx Subscribe<>(OnNext, опционально OnError, опционально OnCompleted)

Пример :var timedstream = Observable.Interval(TimeSpan.FromSeconds(1));

// subscribe to the IObservabletimedstream.Subscribe(v => Console.WriteLine(v));

Microsoft TechDayshttp://www.techdays.ru

Простой пример обработки мыши

Demo

Microsoft TechDayshttp://www.techdays.ru

Реализация Drag & Drop в несколько строчек

Demo

Microsoft TechDayshttp://www.techdays.ru

Где можно использовать Rx?

В приложениях для организации асинхронных и вычислений на основе событийПри работе с асинхронными последовательностями данныхВ паре с Px(Parallel extensions=Task Parallel Library + PLINQ, раньше были внутри Rx)Для упрощения логики - код становится компактным и более читабельным

Вполне возможно, что Rx будет в стандартной поставке Visual Studio vNext

Microsoft TechDayshttp://www.techdays.ru

Про что не было сказано

Внутренне устройство библиотеки (Конструкторы последовательностей, Комбинаторы, etc..)“Горячие” и “Холодные” последовательности событийПрименение Rx c библиотекойTPL

Microsoft TechDayshttp://www.techdays.ru

Литература

Reactive Extension Homepage http://msdn.microsoft.com/en-us/data/gg577609Reactive Extensions for .NET (Rx) [Forum] http://social.msdn.microsoft.com/Forums/en-US/rx/threadsRx Design Guidelines – заметки о том, как проектировался Rx http://go.microsoft.com/fwlink/?LinkID=205219101 Rx Samples (not yet)http://rxwiki.wikidot.com/101samplesRx Sandbox http://mnajder.blogspot.com/2011/05/rx-projects-update.html

Recommended