Реактивные расширения c#
DESCRIPTION
Реактивные расширения C#. Вомпе Федор c тудент -партнер Microsoft. [email protected] Twitter: @ qosys Блог : http://b.qosys.info/. Что такое “ реактивные расширения ”. - PowerPoint PPT PresentationTRANSCRIPT
Microsoft TechDayshttp://www.techdays.ru
Реактивные расширения C#Вомпе Федорcтудент-партнер Microsoft
[email protected]: @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