150 likes | 464 Views
Реактивные расширения C#. Вомпе Федор c тудент -партнер Microsoft. vompe@physics.msu.ru Twitter: @ qosys Блог : http://b.qosys.info/. Что такое “ реактивные расширения ”.
E N D
Реактивные расширения C# Вомпе Федор cтудент-партнер Microsoft vompe@physics.msu.ru Twitter: @qosys Блог: http://b.qosys.info/
Что такое “реактивные расширения” ReactiveExtensions(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.0 • Rx доступна черезNuGet
Rx-библиотеки stable - v1.0.10425, experimental - v1.1.10425
Пример: выпадающая подсказка(suggest) пример из Rx Design Guidelines
IEnumerable<T> Cуществующий интерфейс IEnumerable<T> используется для создания последовательностей из объектов Получаемые последовательности – pull-последовательности, т.к. предоставляют свое содержимое по запросу, MoveNext() : GetEnumerator() -> MoveNext() -> MoveNext() .... -> MoveNext() -> break
ПримерIEnumerable<T> последовательности IEnumerable<int> NaturalNumbers() { int number = 0; while(true) { number++; yield return number; //yield! } } ... foreach(varnum in NaturalNumbers()) PrintSquares(num);
Идея реактивных расширений А чтоесли LINQ использоватьдлясобытий и отложенныхвычислений? (Как и дляперечислимыхIEnumerableпоследовательностей?) В .NET естьпаттерннаблюдатель[Observer, GoF, p293] длясозданияцепочкисвязанныхсобытий– интерфейсыIObservable<T>, IObserver<T> http://www.vincehuston.org/dp/observer.html
IObservable<T> Пара IObservable<>/IObserver<> дуальна паре IEnumerable<>/IEnumerator<> Вместо pull-коллекцийвыступаютpush-коллекции
Pull vs Push PULL Источник(Source) Цель(Target) PUSH PULL – Цели необходимо потребовать данные PUSH– Источник предупреждает цель когда есть данные
Rx: метод Subscribe<> Свойкласс Observer можнонесоздавать(использованиеобычного Subscribe), вместоэтогоможноиспользовать extension-метод Rx Subscribe<>(OnNext, опциональноOnError, опциональноOnCompleted) Пример : vartimedstream = Observable.Interval(TimeSpan.FromSeconds(1)); // subscribe to the IObservable timedstream.Subscribe(v => Console.WriteLine(v));
Demo Простой пример обработки мыши
Demo Реализация Drag & Drop в несколько строчек
Гдеможноиспользовать Rx? • В приложенияхдляорганизацииасинхронных и вычисленийнаосновесобытий • Приработе с асинхроннымипоследовательностямиданных • В паре с Px(Parallel extensions=Task Parallel Library + PLINQ, раньшебыливнутри Rx) • Дляупрощениялогики - кодстановитсякомпактным и болеечитабельным Вполне возможно, что Rx будет в стандартной поставке Visual Studio vNext
Про что не было сказано • Внутренне устройство библиотеки (Конструкторыпоследовательностей, Комбинаторы, etc..) • “Горячие” и “Холодные” последовательности событий • Применение Rx c библиотекойTPL
Литература • Reactive Extension Homepage http://msdn.microsoft.com/en-us/data/gg577609 • Reactive Extensions for .NET (Rx) [Forum] http://social.msdn.microsoft.com/Forums/en-US/rx/threads • Rx Design Guidelines – заметки о том, какпроектировался Rxhttp://go.microsoft.com/fwlink/?LinkID=205219 • 101 Rx Samples (not yet)http://rxwiki.wikidot.com/101samples • Rx Sandbox http://mnajder.blogspot.com/2011/05/rx-projects-update.html