produktives eventhandling mit reactive extensions (developer week 2013)
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 2013TRANSCRIPT
© Zühlke 2013
Kerry W. Lothrop
mit Reactive Extensions
Von Kerry W. Lothrop
Produktives Eventhandling
Was sind Rx?
Rx
Soci
al M
edia
GPS
UI Events
RFID
LINQ
IEnumerable<T>
public static IEnumerable<T> Where( this IEnumerable<T> source, Func<T, bool> predicate);
IEnumerable<T>
Task<T>
Ein Rückgabewert n Rückgabewerte
Pull
Push ?
T
IObservable<T>
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(); }
© Zühlke 2013
Offener Eventstream
24. Juni 2013 Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop Folie 11
OnNext() OnNext() OnNext() OnNext()
© Zühlke 2013
Eventstream mit Ende
24. Juni 2013 Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop Folie 12
OnNext() OnNext() OnNext() OnCompleted()
© Zühlke 2013
Eventstream mit Fehler
24. Juni 2013 Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop
OnNext() OnNext() OnNext()
Folie 13
OnError()
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
© Zühlke 2013
Produktives Eventhandling mit Reactive Extensions
Kerry W. Lothrop
Beispiel
Suchergebnisse aus einem Wörterbuch anzeigen
24. Juni 2013 Folie 15
© 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;
System.Reactive.Linq.Observable
Func<Task<T>> IObservable<T>
1x OnNext()
1x OnCompleted()
await IObservable<T>
Letztes OnNext() vor OnCompleted() wird zurückgegeben
Rx und async
var webClient = new WebClient(); var download = webClient.DownloadStringAsync(uri) .ToObservable() .Timeout(Timespan.FromSeconds(15)); var result = await download;
© Zühlke 2013
Produktives Eventhandling mit Reactive Extensions
Kerry W. Lothrop
Beispiel
Sprung als Eingabe erkennen
24. Juni 2013 Folie 21
© 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
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) );
© 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
© Zühlke 2013
Produktives Eventhandling mit Reactive Extensions
Kerry W. Lothrop
Fazit
24. Juni 2013 Folie 25
© 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
Wollen Sie mehr dazu wissen? Vernetzen Sie sich mit mir!
Kerry Lothrop