Rx la joya oculta de Net
-
Upload
edin-kapic -
Category
Software
-
view
2.659 -
download
1
Transcript of Rx la joya oculta de Net
#dotNetSpain2016
dotNet Spain Conference 2016
#dotNetSpain2016
Edin KapićSharePoint Practice Lead @ Sogeti [email protected]
Rx, la joya oculta de NET
Patrocinadores
Colaboradores
#dotNetSpain2016
#dotNetSpain2016
¿Rx?Introducción
RxObservablesSujetosTratamiento de secuencias
¡Rx!Reimaginando nuestro códigoRx en en mundo realMás allá de Rx
Agenda
#dotNetSpain2016
Senior Architect & SharePoint Practice Lead
Edin Kapić
sug.cat
@ekapicwww.edinkapic.com
Presidente
Autor
#dotNetSpain2016
¿Rx?
#dotNetSpain2016
Rx (Reactive eXtensions) es una librería .NET que permite hacer programación reactiva
¿Qué es Rx?
Sí, esto es lo que parece: una anguila eléctrica (Electrophorus electricus)
#dotNetSpain2016
Un modelo de programación orientado a flujos de datos y la propagación de los cambios
https://en.wikipedia.org/wiki/Reactive_programming
¿Qué es programación reactiva?
Esto es un marble diagram (diagrama de canicas)
#dotNetSpain2016
Flujos de datos y Rx
API unificada de consumo de datos
asíncronos
#dotNetSpain2016
Rx = Observables + LINQ + Schedulers
Rx = LINQ-to-Events
IEnumerable = Pull, IObservable = Push
Analogías útiles
#dotNetSpain2016
La arquitectura de Rx• obs.Where(x=>x.ID == 1)• Observable.Create()
Extensiones y LINQ
• IObservable• IObserver• Subject
Flujos y eventos
• IScheduler• Dispatchers• Timers
Concurrencia
#dotNetSpain2016
NuGet Rx-MainNET 4+UWPWindows Phone
NuGet RxJS-MainJavaScript
NPM RxNode.js
¿Cómo obtener Rx?
System.Reactive
#dotNetSpain2016
Rx en otras plataformas
#dotNetSpain2016
Rx
static void Main(string[] args){ IObservable<char> obs = "Hello, world!".ToObservable(); obs.Subscribe(x =>
Console.WriteLine(x)); Console.ReadLine();}
Hello, world con Rx
#dotNetSpain2016
Secuencia (flujo, stream) asíncrona de datosObservable
namespace System{ public interface IObservable<out T> {
IDisposable Subscribe(IObserver<T> observer); }}
#dotNetSpain2016
El consumidor de una secuencia observableObserver
namespace System{ public interface IObserver<in T> {
void OnCompleted();void OnError(Exception error);void OnNext(T value);
}}
Click icon to add picture
Un momento, ¿esto no es algo parecido a……enumerables?
…eventos?
#dotNetSpain2016
Observable versus EnumerableIObservableSubscribe()
IObserverOnNext()OnCompleted()OnError()
IEnumerableGetEnumerator()
IEnumeratorCurrentMoveNext()Reset()
1…2….3….
Observer
1…2….3….
Enumerator
OnNext()MoveNext()
Push Pull
#dotNetSpain2016
Observable versus EventosObservableObjetos “de primera”Todo son métodos normalesSe pueden hacer consultas históricasCiclo de vida sencillo basado en IDisposable
EventoDifícil de componer varios eventos+= -= no es muy amigableNo hay histórico de eventosDifícil de controlar el ciclo de vida
IObservable = Eventos+++
1 2 HandlerSourceObserverObserverObserver
Click icon to add picture
Vale, seguimos con Rx…
#dotNetSpain2016
Subject es IObservable y IObserver a la vezÚtil para hacer de proxy entre los “clientes” y el “origen” de datos
Subject<T>
var subject = new Subject<string>();subject.Subscribe(value => Console.WriteLine(value));subject.OnNext("a");subject.OnNext("b");subject.OnNext("c");
#dotNetSpain2016
Tipos de Subjects
ReplaySubject<T>
BehaviorSubject<T> AsyncSubject<T>
Reproduce todos los valores de la
secuencia para todos los suscritores
Reproduce el último valor de la secuencia
Publica el último resultado de la
secuencia al acabar
Subject.Create()
#dotNetSpain2016
Ciclo de vida de una suscripciónSuscripciónvar sub = IObservable.Subscribe(…);
Fin de suscripciónsub.Dispose();
Observable ObserverOnNext(1)Subscribe(observe
r)
Subscription: IDisposable
OnNext(2)
1 2
#dotNetSpain2016
Secuencias finitas y los errores
Observable ObserverOnCompleted()Subscribe(observ
er)
Subscription: IDisposable
OnError(exception)
1 2
#dotNetSpain2016
Creación de secuenciasManualmente
Observable.ReturnObservable.EmptyObservable.NeverObservable.RangeObservable.CreateObservable.GenerateObservable.IntervalObservable.Timer
A partir de otras cosas
Observable.StartObservable.FromEventPatternObservable.FromAsyncPattern
Task.ToObservable
IEnumerable.ToObservable
Click icon to add picture
Muy bonito, pero no le veo la utilidad
#dotNetSpain2016
Ejemplo: Búsqueda en redes sociales
SearchObservable
Subscribe()
OnNext(x)
TwitterSrch
FacebookSrch
InstagramSrch
Observable.Merge()
GetResultAsync()
GetResultAsync()
GetResultAsync()
Task<T>.ToObservable()
Inte
rnet
#dotNetSpain2016
¿Qué podemos hacer con las secuencias?
1 2
2
1
2
1 2
Filtrar Combinar
1 2
3
Mapear
1 2
B
Reducir
A
Where(x== 2)Merge()
Select(f(x))
Sum()
• Where• OfType
• GroupBy• Buffer• Window
• Distinct• DistinctUntilChanged
• Skip• Take• SkipUntil• TakeUntil
Operadores LINQFiltrar
Agrupar
Valores únicos
Partición
http://freecontent.manning.com/animated-gifs/?s=reactive-extensions
#dotNetSpain2016
ProyecciónSelect SelectMany
1 2
BA
1 2
A BA
Select(x.ToLetter) Select(x.FromAToLetter)
#dotNetSpain2016
Count, Min, Max, Sum, AverageDevuelven un valor escalar
First, Last, SingleDevuelven un elemento de la secuencia
Aggregate, ScanFunción de reducción
Reducción
1 2
3
Sum()
Click icon to add picture
Un momento, no he visto nada de “secuencias en el tiempo” todavía…
#dotNetSpain2016
Combinar secuenciasConcat Switch
1 2
21
3 4
3 4
Merge1 2
31
3 4
2 4
1 2
3
3 4
4
#dotNetSpain2016
Schedulerspublic interface IScheduler{ DateTimeOffset Now { get; } IDisposable Schedule<TState>(TState state,
Func<IScheduler, TState, IDisposable> action); IDisposable Schedule<TState>(TState state,
DateTimeOffset dueTime, Func<IScheduler, TState, IDisposable>
action); IDisposable Schedule<TState>(TState state,
TimeSpan dueTime, Func<IScheduler, TState, IDisposable>
action);}
#dotNetSpain2016
• new Thread(() => { /* do work */ }).Start()• ThreadPool.QueueUserWorkItem(_ => { /* do work */ }, null)• Task.Factory.StartNew(() => { /* do work */ })• syncCtx.Post(_ => { /* do work */ }, null)• Dispatcher.BeginInvoke(() => { /* do work */ })
Abstracción de concurrencia
• scheduler.Schedule(() => { /* do work */ })
#dotNetSpain2016
La mayoría de las operaciones de Rx usan schedulers
Rx y concurrencia
#dotNetSpain2016
Scheduler como parámetro
#dotNetSpain2016
Tipos de schedulers
• ImmediateScheduler • CurrentThreadScheduler• NewThreadScheduler• EventLoopScheduler• HistoricalScheduler
• ControlScheduler• DispatcherScheduler• SynchronizationContextSchedul
er• TaskPoolScheduler• ThreadPoolScheduler
Genéricos Implementados por la plataforma
#dotNetSpain2016
HistoricalScheduler
http://blogs.msdn.com/b/rxteam/archive/2012/06/14/testing-rx-queries-using-virtual-time-scheduling.aspx
#dotNetSpain2016
SubscribeOnDonde se ejecuta el Observable
ObserveOnDonde se ejecuta el Observer
Cambiando el lugar de la ejecución
#dotNetSpain2016
¡Rx!
#dotNetSpain2016
Código que gestiona llamadas asíncronas o eventos
Código que manipula secuencias asíncronas de datos
¿Dónde aplicar Rx?
https://github.com/AdaptiveConsulting/ReactiveTrader
#dotNetSpain2016
Ejemplo: Sugerencias de búsqueda
#dotNetSpain2016
Rx en el mundo real
#dotNetSpain2016
Ix (Interactive Expressions)Más allá de Rx
#dotNetSpain2016
IQbservable<T>Más allá de Rx
#dotNetSpain2016
Tx Logs y trazas reactivos
Más allá de Rx
#dotNetSpain2016
ReactiveUI UI en Xamarin, UWP y WPF con soporte para Rxhttps://github.com/reactiveui
Más allá de Rx
Click icon to add picture
Recursos
#dotNetSpain2016
Código fuenteDe Rx: https://github.com/Reactive-Extensions/Rx.NETDe esta sesión: https://github.com/ekapic/Rx-Dns2016
Tutorialeshttp://introtorx.com/ http://reactivex.io https://msdn.microsoft.com/en-us/data/gg577609
Links útiles
https://manning.com/books/reactive-extensions-in-action
Q&A
#dotNetSpain2016
http://aka.ms/DOTNETT7S5
No olvides realizar la encuesta¡Gracias!
#dotNetSpain2016
Edin KapićSharePoint Practice Lead @ Sogeti [email protected] http://aka.ms/DOTNETT7S5