Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Produktives Eventhandling
mit Reactive Extensions
Von Kerry W. Lothrop

Kerry W. Lothrop
© Zühlke 2013
Was sind Rx?
RFID

Rx
GPS

UI Events

Social Media
LINQ
IEnumerable<T>
public static IEnumerable<T> Where(
this IEnumerable<T> source,
Func<T, bool> predicate);
Ein Rückgabewert

n Rückgabewerte

Pull

T

IEnumerable<T>

Push

Task<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();
}
Offener Eventstream

OnNext()

Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop

OnNext()

OnNext()

2...
Eventstream mit Ende

OnNext()

Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop

OnNext()

OnNext()

...
Eventstream mit Fehler

OnNext()

Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop

OnNext()

OnNext()...
Lässt sich nicht
weiterreichen

Datenquelle versteckt

button.MouseMove += (sender, args) =>
{
if (args.X > 100)
{
Keine K...
Beispiel
Suchergebnisse aus einem Wörterbuch anzeigen

Produktives Eventhandling mit
Reactive Extensions
Folie 15
24. Juni...
Rx im Vergleich zu LINQ

Enumerable Collections

Observable Collections

Enumerable.Range(0, 9)
.Where(x => x % 2 == 0)
.S...
System.Reactive.Linq.Observable
Func<Task<T>>
1x OnNext()
1x OnCompleted()

IObservable<T>
await IObservable<T>
Letztes OnNext() vor OnCompleted() wird zurückgegeben
Rx und async

var webClient = new WebClient();
var download = webClient.DownloadStringAsync(uri)
.ToObservable()
.Timeout(...
Beispiel
Sprung als Eingabe erkennen

Produktives Eventhandling mit
Reactive Extensions
Folie 21
24. Juni 2013

Kerry W. L...
Brauchen wir noch Events?

.NET Events

Rx

•

Code-zentrisch

•

Daten-zentrisch

•

Design-time

•

Nicht zur Design-tim...
Testbarkeit: Virtualisierung der Zeit

var scheduler = new TestScheduler();
var obs = scheduler.CreateHotObservable<string...
Was gibt es noch?

•

RxJS

•

Rx++

•

Ix

•

IxJS

•

Ix++

•

ReactiveUI

Produktives Eventhandling mit Reactive Extens...
Fazit

Produktives Eventhandling mit
Reactive Extensions
Folie 25
24. Juni 2013

Kerry W. Lothrop
© Zühlke 2013
Fazit: Reactive Extensions

•

Für alle eventgetriebenen Systeme

•

Einfach zu handhaben

•

Gewohnte LINQ-Syntax

•

Tes...
Wollen Sie mehr dazu
wissen?
Vernetzen Sie sich mit
mir!
Kerry Lothrop
Nächste SlideShare
Wird geladen in …5
×

Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

1.926 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Technologie, News & Politik, Sport
  • Als Erste(r) kommentieren

Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

  1. 1. Produktives Eventhandling mit Reactive Extensions Von Kerry W. Lothrop Kerry W. Lothrop © Zühlke 2013
  2. 2. Was sind Rx?
  3. 3. RFID Rx GPS UI Events Social Media
  4. 4. LINQ
  5. 5. IEnumerable<T>
  6. 6. public static IEnumerable<T> Where( this IEnumerable<T> source, Func<T, bool> predicate);
  7. 7. Ein Rückgabewert n Rückgabewerte Pull T IEnumerable<T> Push Task<T> ?
  8. 8. IObservable<T>
  9. 9. public interface IObservable<out T> { IDisposable Subscribe(IObserver<T> observer); }
  10. 10. public interface IObserver<in T> { void OnNext(T value); void OnError(Exception error); void OnCompleted(); }
  11. 11. Offener Eventstream OnNext() Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop OnNext() OnNext() 24. Juni 2013 OnNext() Folie 11 © Zühlke 2013
  12. 12. Eventstream mit Ende OnNext() Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop OnNext() OnNext() 24. Juni 2013 OnCompleted() Folie 12 © Zühlke 2013
  13. 13. Eventstream mit Fehler OnNext() Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop OnNext() OnNext() 24. Juni 2013 OnError() Folie 13 © Zühlke 2013
  14. 14. Lässt sich nicht weiterreichen Datenquelle versteckt button.MouseMove += (sender, args) => { if (args.X > 100) { Keine Komposition // do something } }; button.MouseMove -= // TODO: Fix Schwierige Ressourcenverwaltung
  15. 15. Beispiel Suchergebnisse aus einem Wörterbuch anzeigen Produktives Eventhandling mit Reactive Extensions Folie 15 24. Juni 2013 Kerry W. Lothrop © Zühlke 2013
  16. 16. Rx im Vergleich zu LINQ Enumerable Collections Observable Collections Enumerable.Range(0, 9) .Where(x => x % 2 == 0) .Select(x => 100 + x); Observable.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; from x in Observable.Range(0, 9) where x % 2 == 0 select 100 + x; Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop 24. Juni 2013 Folie 16 © Zühlke 2013
  17. 17. System.Reactive.Linq.Observable
  18. 18. Func<Task<T>> 1x OnNext() 1x OnCompleted() IObservable<T>
  19. 19. await IObservable<T> Letztes OnNext() vor OnCompleted() wird zurückgegeben
  20. 20. Rx und async var webClient = new WebClient(); var download = webClient.DownloadStringAsync(uri) .ToObservable() .Timeout(Timespan.FromSeconds(15)); var result = await download;
  21. 21. Beispiel Sprung als Eingabe erkennen Produktives Eventhandling mit Reactive Extensions Folie 21 24. Juni 2013 Kerry W. Lothrop © Zühlke 2013
  22. 22. Brauchen wir noch Events? .NET Events Rx • Code-zentrisch • Daten-zentrisch • Design-time • Nicht zur Design-time • Keine vollwertigen Objekte • Vollwertige Objekte • Keine Komposition • Vielfältige Komposition • Leichtgewichtig • Etwas aufwändiger als Events Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop 24. Juni 2013 Folie 22 © Zühlke 2013
  23. 23. 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) );
  24. 24. Was gibt es noch? • RxJS • Rx++ • Ix • IxJS • Ix++ • ReactiveUI Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop 24. Juni 2013 Folie 24 © Zühlke 2013
  25. 25. Fazit Produktives Eventhandling mit Reactive Extensions Folie 25 24. Juni 2013 Kerry W. Lothrop © Zühlke 2013
  26. 26. Fazit: Reactive Extensions • Für alle eventgetriebenen Systeme • Einfach zu handhaben • Gewohnte LINQ-Syntax • Testbar • Cross-Platform • Open Source • http://rx.codeplex.com Produktives Eventhandling mit Reactive Extensions | Kerry W. Lothrop 24. Juni 2013 Folie 26 © Zühlke 2013
  27. 27. Wollen Sie mehr dazu wissen? Vernetzen Sie sich mit mir! Kerry Lothrop

×