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
Upcoming SlideShare
Loading in...5
×

Produktives Eventhandling mit reactive Extensions (Developer Week 2013)

1,249

Published on

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

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,249
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×