rx 101 codemotion milan 2015 - tamir dresher

38
MILAN 20/21.11.2015 Talk title: Reactive Extensions 101 Tamir Dresher – CodeValue - @tamir_dresher

Upload: tamir-dresher

Post on 12-Apr-2017

478 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Rx 101   Codemotion Milan 2015 - Tamir Dresher

MILAN 20/21.11.2015

Talk title: Reactive Extensions 101Tamir Dresher – CodeValue - @tamir_dresher

Page 2: Rx 101   Codemotion Milan 2015 - Tamir Dresher

• Software Architect, Consultant and Instructor

• Software Engineering Lecturer @ Ruppin Academic Center

@[email protected]://www.TamirDresher.com.

Page 3: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Your headache relief pill to Asynchronous and Event based applications

AsyncPush

TriggersEvents

Reactive Extensions

Page 4: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Reactive Programming concentrates on the propagation of changes and

their effectssimply put, how to react to

changes and create dataflows that depend on

them

Reactive Programming

Page 5: Rx 101   Codemotion Milan 2015 - Tamir Dresher

5

Socialmedia

High Rate Data

IoTGPS

External Services

UI eve

nts

Your System

So Many Sources…

Page 6: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Source/Producer

Target/Consumer

Producer-Consumer

Page 7: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Source/Producer

Target/Consumer

Source/Producer

Source/Producer

Target/Consumer

Target/Consumer

Producer-Consumer

Page 8: Rx 101   Codemotion Milan 2015 - Tamir Dresher

IEnumerable<Message> LoadMessages(string hashtag){

var statuses = facebook.Search(hashtag);var tweets = twitter.Search(hashtag);var updates = linkedin.Search(hashtag);return statuses.Concat(tweets).Concat(updates);

}

Twitter AppLinkedi

n

Facebook

Pull Model

Page 9: Rx 101   Codemotion Milan 2015 - Tamir Dresher

???? LoadMessages(string hashtag){

facebook.Search(hashtag);twitter.Search(hashtag);linkedin.Search(hashtag);

}

DoSomething( )msg

Push Model

Page 10: Rx 101   Codemotion Milan 2015 - Tamir Dresher

observable observer

Subscribe(observer)

subscription

OnNext(X1)

OnNext(Xn)⁞

X1observable X2 Xn

⁞IDisposable

Observables and Observers

Page 11: Rx 101   Codemotion Milan 2015 - Tamir Dresher

OnCompleted()

OnError(Exception)

observable

observable observer

X1 X2 Xn

Observables and Observers

Page 12: Rx 101   Codemotion Milan 2015 - Tamir Dresher

namespace System{ public interface IObservable<out T> { IDisposable Subscribe(IObserver<T> observer); }

public interface IObserver<in T> { void OnNext(T value); void OnError(Exception error); void OnCompleted(); }}

Interfaces

Page 13: Rx 101   Codemotion Milan 2015 - Tamir Dresher

MILAN 20/21.11.2015

Creating Observables

Page 14: Rx 101   Codemotion Milan 2015 - Tamir Dresher

IObservable<Message> ObserveMessages(string hashtag){

}

return Observable.Create( async (o) => {

});

var messages = await GetMessagesAsync(hashtag);foreach(var m in messages){ o.OnNext(m);}o.OnCompleted();

Pull To Push

Page 15: Rx 101   Codemotion Milan 2015 - Tamir Dresher

IObservable<Message> ObserveMessages(string hashtag){

}

return Observable.Defer( async () => {

});

var messages = await GetMessagesAsync(hashtag);return message.ToObservable();

Built-in Converters

Page 16: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Observable.Merge(

facebook.ObserveMessages(hashtag),

twitter.ObserveMessages(hashtag),

linkedin.ObserveMessages(hashtag));

Built-in Operators

Page 17: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Observable.Range(1, 10)    .Subscribe(x => Console.WriteLine(x));

Observable.Interval(TimeSpan.FromSeconds(1))    .Subscribe(x => Console.WriteLine(x));

Observable.FromEventPattern(SearchBox, "TextChanged")

1 2 10

⁞1 2 10

⁞1 sec 1 sec

Observables Factories

Page 18: Rx 101   Codemotion Milan 2015 - Tamir Dresher

MILAN 20/21.11.2015

Observable Queries (Rx Operators)

Page 19: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Filtering Projection Partitioning Joins Grouping Set

Element Generation Quantifiers Aggregation Error HandlingTime and Concurrency

Where

OfType

Select

SelectMany

Materialize

Skip

Take

TakeUntil

CombineLatest

Concat

join

GroupBy

GroupByUntil

Buffer

Distinct

DistinctUntilChanged

Timeout

TimeInterval

ElementAt

First

Single

Range

Repeat

Defer

All

Any

Contains

Sum

Average

Scan

Catch

OnErrorResumeNext

Using

Page 20: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Operator2 Creates an IObservable<T3>

IObservable<T2> Operator<T1>(IObservable<T1> source, parameters);

Operator 1 Subscribe( )

observer

observable… Operator

N

Operator1 Creates an IObservable<T2>

IObservable<T>Original source

observerSubscribe

Composability

Page 21: Rx 101   Codemotion Milan 2015 - Tamir Dresher

g(x)

f(x)

Observable Query Pipeline

Page 22: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Reactive Search

Page 23: Rx 101   Codemotion Milan 2015 - Tamir Dresher

1. At least 3 characters2. Don’t overflow server (0.5 sec delay)3. Don’t send the same string again4. Discard results if another search was

requested

Reactive Search - Rules

Page 24: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Demo

Page 25: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Var textChanged = Observable.FromEventPattern(txt,

“TextChanged”).Select(_=>txt.Text);

textChanged.Where(text=>text.Length>3).Throttle(TimeSpan.FromSeconds(0.5)).DistinctUntilChanged().SelectMany(text => SearchAsync(text)).Switch().Subscribe(/*handle the results*/);

Page 26: Rx 101   Codemotion Milan 2015 - Tamir Dresher

var $input = $('#input'), $results = $('#results');

Rx.Observable.fromEvent($input, 'keyup') .map(e => e.target.value) .filter(text => text.length > 3) .throttle(500 /* ms */) .distinctUntilChanged() .flatMapLatest(searchWikipedia) .subscribe(data => { var res = data[1]; $results.empty(); $.each(res, (_, value) => $('<li>' + value + '</li>').appendTo($results)); }, error => { /* handle any errors */ $results.empty(); $('<li>Error: ' + error + '</li>').appendTo($results);});

Page 27: Rx 101   Codemotion Milan 2015 - Tamir Dresher

MILAN 20/21.11.2015

Abstracting Time and Concurrency

Page 28: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Thread Pool

Task Scheduler

other

Schedulers

Page 29: Rx 101   Codemotion Milan 2015 - Tamir Dresher

public interface IScheduler{ DateTimeOffset Now { get; }

IDisposable Schedule<TState>( TState state, Func<IScheduler, TState, IDisposable> action);

IDisposable Schedule<TState>(TimeSpan dueTime, TState state,Func<IScheduler, TState, IDisposable> action);

IDisposable Schedule<TState>(DateTimeOffset dueTime,

TState state,Func<IScheduler, TState, IDisposable> action);

}

Page 30: Rx 101   Codemotion Milan 2015 - Tamir Dresher

//// Runs a timer on the default scheduler//IObservable<T> Throttle<T>(TimeSpan dueTime);

//// Every operator that introduces concurrency// has an overload with an IScheduler//IObservable<T> Throttle<T>(TimeSpan dueTime, IScheduler scheduler);

Parameterizing Concurrency

Page 31: Rx 101   Codemotion Milan 2015 - Tamir Dresher

textChanged

.Throttle(TimeSpan.FromSeconds(0.5),

DefaultScheduler.Instance).DistinctUntilChanged().SelectMany(text =>

SearchAsync(text)).Switch().Subscribe(/*handle the

results*/);

Page 32: Rx 101   Codemotion Milan 2015 - Tamir Dresher

//// runs the observer callbacks on the specified // scheduler.//IObservable<T> ObserveOn<T>(IScheduler);

//// runs the observer subscription and unsubsciption on// the specified scheduler.//IObservable<T> SubscribeOn<T>(IScheduler)

Changing Execution Context

Page 33: Rx 101   Codemotion Milan 2015 - Tamir Dresher

textChanged.Throttle(TimeSpan.FromSeconds(0.5)).DistinctUntilChanged().SelectMany(text =>

SearchAsync(text)).Switch()

.ObserveOn(DispatcherScheduler.Current).Subscribe(/*handle the results*/);

Changing Execution Context

Page 34: Rx 101   Codemotion Milan 2015 - Tamir Dresher

textChanged.Throttle(TimeSpan.FromSeconds(0.5)).DistinctUntilChanged().SelectMany(text =>

SearchAsync(text)).Switch().ObserveOnDispatcher().Subscribe(/*handle the results*/);

Changing Execution Context

Page 35: Rx 101   Codemotion Milan 2015 - Tamir Dresher

http://blogs.msdn.com/b/rxteam/archive/2012/06/14/testing-rx-queries-using-virtual-time-scheduling.aspx

Virtualizing Time

Page 36: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Your headache relief pill to Asynchronous and Event based applications

AsyncPush

TriggersEvents

Reactive Extensions

Page 37: Rx 101   Codemotion Milan 2015 - Tamir Dresher

Thank You

www.manning.com/dresher www.reactivex.io github.com/Reactive-Extensions

Discount code: ctwcodemot 

Page 38: Rx 101   Codemotion Milan 2015 - Tamir Dresher

MILAN 20/21.11.2015 - Tamir Dresher – Rx 101

Leave your feedback on Joind.in!https://m.joind.in/event/codemotion-milan-2015

Presenter contact detailst: @tamir_dreshere: [email protected]: TamirDresher.comw: www.codevalue.net