Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

27
© Zühlke 2013 Kerry W. Lothrop mit Reactive Extensions Von Kerry W. Lothrop Produktives Eventhandling

description

More on Kerry's Blog (http://kerry.lothrop.de/detecting-jump/): DWX13 Follow-up: Detecting jumps with Kinect and Reactive Extensions. Asynchrone Programmierung ist der Schwerpunkt des neuen .NET-Frameworks 4.5 und der neuen Versionen von C# und Visual Basic. Die Reactive Extensions (Rx) ergänzen diese neue Funktionalität mit einer neuen, modernen Herangehensweise an Eventhandling, inklusive Unterstützung für LINQ und Lambda-Ausdrücke. In diesem Vortrag wird anhand vieler Beispiele gezeigt, wo Reactive Extensions eine sinnvolle Alternative zum klassischen Eventhandling bieten und wie Reactive Extensions mit der Task Parallel Library (TPL) und async/await Hand in Hand gehen, um ein mächtiges Werkzeug für jeden .NET-Entwickler zu sein. Vortrag von Kerry W. Lothrop (24. Juni 2013) auf der .NET Developer Conference 2013

Transcript of Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

Page 1: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

Kerry W. Lothrop

mit Reactive Extensions

Von Kerry W. Lothrop

Produktives Eventhandling

Page 2: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

Was sind Rx?

Page 3: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

Rx

Soci

al M

edia

GPS

UI Events

RFID

Page 4: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

LINQ

Page 5: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

IEnumerable<T>

Page 6: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

public static IEnumerable<T> Where( this IEnumerable<T> source, Func<T, bool> predicate);

Page 7: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

IEnumerable<T>

Task<T>

Ein Rückgabewert n Rückgabewerte

Pull

Push ?

T

Page 8: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

IObservable<T>

Page 9: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

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

Page 10: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

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

Page 11: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

Offener Eventstream

24. Juni 2013 Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop Folie 11

OnNext() OnNext() OnNext() OnNext()

Page 12: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

Eventstream mit Ende

24. Juni 2013 Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop Folie 12

OnNext() OnNext() OnNext() OnCompleted()

Page 13: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

Eventstream mit Fehler

24. Juni 2013 Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop

OnNext() OnNext() OnNext()

Folie 13

OnError()

Page 14: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

button.MouseMove += (sender, args) => { if (args.X > 100) { // do something } }; button.MouseMove -= // TODO: Fix

Lässt sich nicht weiterreichen

Datenquelle versteckt

Keine Komposition

Schwierige Ressourcenverwaltung

Page 15: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

Produktives Eventhandling mit Reactive Extensions

Kerry W. Lothrop

Beispiel

Suchergebnisse aus einem Wörterbuch anzeigen

24. Juni 2013 Folie 15

Page 16: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

Rx im Vergleich zu LINQ

24. Juni 2013 Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop Folie 16

Enumerable Collections

Enumerable.Range(0, 9) .Where(x => x % 2 == 0) .Select(x => 100 + x);

from x in Enumerable.Range(0, 9) where x % 2 == 0 select 100 + x;

Observable Collections

Observable.Range(0, 9) .Where(x => x % 2 == 0) .Select(x => 100 + x);

from x in Observable.Range(0, 9) where x % 2 == 0 select 100 + x;

Page 17: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

System.Reactive.Linq.Observable

Page 18: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

Func<Task<T>> IObservable<T>

1x OnNext()

1x OnCompleted()

Page 19: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

await IObservable<T>

Letztes OnNext() vor OnCompleted() wird zurückgegeben

Page 20: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

Rx und async

var webClient = new WebClient(); var download = webClient.DownloadStringAsync(uri) .ToObservable() .Timeout(Timespan.FromSeconds(15)); var result = await download;

Page 21: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

Produktives Eventhandling mit Reactive Extensions

Kerry W. Lothrop

Beispiel

Sprung als Eingabe erkennen

24. Juni 2013 Folie 21

Page 22: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

.NET Events

• Code-zentrisch

• Design-time

• Keine vollwertigen Objekte

• Keine Komposition

• Leichtgewichtig

Brauchen wir noch Events?

24. Juni 2013 Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop Folie 22

Rx

• Daten-zentrisch

• Nicht zur Design-time

• Vollwertige Objekte

• Vielfältige Komposition

• Etwas aufwändiger als Events

Page 23: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

Testbarkeit: Virtualisierung der Zeit

var scheduler = new TestScheduler(); var obs = scheduler.CreateHotObservable<string>( OnNext(500, "test 20"), OnNext(600, "test 100"), OnCompleted<string>(700) ); var results = scheduler.Start(() => from n in obs select n.Length); results.Messages.AssertEqual( OnNext(500, 7), OnNext(600, 8), OnCompleted<int>(700) );

Page 24: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

• RxJS

• Rx++

• Ix

• IxJS

• Ix++

• ReactiveUI

Was gibt es noch?

Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop 24. Juni 2013 Folie 24

Page 25: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

Produktives Eventhandling mit Reactive Extensions

Kerry W. Lothrop

Fazit

24. Juni 2013 Folie 25

Page 26: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

© Zühlke 2013

• Für alle eventgetriebenen Systeme

• Einfach zu handhaben

• Gewohnte LINQ-Syntax

• Testbar

• Cross-Platform

• Open Source

• http://rx.codeplex.com

Fazit: Reactive Extensions

24. Juni 2013 Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop Folie 26

Page 27: Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

Wollen Sie mehr dazu wissen? Vernetzen Sie sich mit mir!

Kerry Lothrop