Reactive extensions rx explained
Download
1 / 27

Reactive Extensions (Rx) Explained - PowerPoint PPT Presentation


  • 117 Views
  • Uploaded on

Reactive Extensions (Rx) Explained. Presenter: Kevin Grossnicklaus August 5 th , 2011. Agenda. Introductions Talk Additional Resources Conclusion. Introductions. Kevin Grossnicklaus ArchitectNow- www.architectnow.net (2009-Present) President

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Reactive Extensions (Rx) Explained' - hosea


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Reactive extensions rx explained

Reactive Extensions (Rx) Explained

Presenter:

Kevin Grossnicklaus

August 5th, 2011


Agenda
Agenda

  • Introductions

  • Talk

  • Additional Resources

  • Conclusion


Introductions
Introductions

  • Kevin Grossnicklaus

    • ArchitectNow-www.architectnow.net (2009-Present)

      • President

    • Washington University - CAIT Program (2003-2010)

      • Instructor

    • SSE - www.SSEinc.com (1999-2009)

      • Chief Architect

      • Software Development Practice Leader

  • Email: [email protected]

  • Twitter: @kvgros

  • Blog: blog.architectnow.net



Expectations1
Expectations

  • Experience with .NET development

    • Samples will be in C# 4.0

    • VS 2010 will be used

  • Basic familiarity with LINQ and some Async programming

  • Lambda Expressions will be used



Ienumerable ienumerator
IEnumerable/IEnumerator

interface IEnumerable<T>

{

IEnumerator<T> GetEnumerator();

}

interface IEnumerator<T> : IDisposable

{

boolMoveNext();

T Current { get; }

void Reset();

}


Iterating collections
Iterating Collections

var items = new string[] { “Hello”, “World” };

foreach (var x in items)

{

//interact with each piece of data

}

//we can now assume we are done

//we must also handle exceptions


Iobservable iobserver
IObservable/IObserver

interface IObservable<out T>

{

IDisposable Subscribe(IObserver<T> observer);

}

interface IObserver<in T>

{

void OnNext(T value);

void OnError(Exception ex);

void OnCompleted();

}


Iobservable iobserver1
IObservable/IObserver

var _data = new string[] { "Hello", "World" };  

var _observable = _data.ToObservable();

var _observer = _observable.Subscribe(x => Console.WriteLine(x));

var _observer2 = _observable.Subscribe(                

x => Console.WriteLine(x),                

() => Console.WriteLine("Completed"));

var _observer3 = _observable.Subscribe(                 

x => Console.WriteLine(x),                 

ex => Console.WriteLine("Exception: " + ex.Message),

() => Console.WriteLine("Completed"));

_observer2.Dispose();


Getting rx installed
Getting Rx Installed

  • NuGet

    • Easiest and quickest

  • Rx Home Page:

    • http://msdn.microsoft.com/en-us/data/gg577609

  • Simply add a reference to:

    • System.Reactive.DLL

  • Available for:

    • Full Framework (WPF, WinForms, server side ASP.NET, MVC, etc)

    • Silverlight 3 and 4

    • JavaScript

    • Windows 7 Phone

    • Xbox/XNA



Subjects
Subjects

using System.Reactive.Subjects;

var _subject = new Subject<string>();     

var _observer = _subject.Subscribe(x => Console.WriteLine(x));

_subject.OnNext("Rx");             

_subject.OnNext("will");            

_subject.OnNext("save");             

_subject.OnNext("me");             

_subject.OnNext("some");            

_subject.OnNext("headaches");             

_subject.OnCompleted();

_observer.Dispose();


Subscribing
Subscribing

public static class ObservableExtensions

{

public static IDisposable Subscribe<TSource>(this IObservable<TSource> source);

public static IDisposable Subscribe<TSource>(this IObservable<TSource> source, Action<TSource> onNext);

public static IDisposable Subscribe<TSource>(this IObservable<TSource> source, Action<TSource> onNext, Action<Exception> onError);

public static IDisposable Subscribe<TSource>(this IObservable<TSource> source, Action<TSource> onNext, Action onCompleted);

public static IDisposable Subscribe<TSource>(this IObservable<TSource> source, Action<TSource> onNext, Action<Exception> onError, Action onCompleted);

}


Creation of observables
Creation of Observables

//simply call OnComplete

varempty = Observable.Empty<string>();

//Call OnNext(“Value”) and then call OnComplete

varobReturn = Observable.Return("Value");

//Raise no events

varnever = Observable.Never<string>();      

//Call OnException with the specified expection

var throws = Observable.Throw<string>(new Exception());

//Specify a delegate to be called when anyone subscribes

varcreateSample = Observable.Create<string>( observable => {

observable.OnNext("a");

observable.OnNext("b");

observable.OnCompleted();

return () => Console.WriteLine("Observer has unsubscribed");

});


Creation of observables cont
Creation of Observables (Cont…)

//Create a range of numbers

var range = Observable.Range(10, 15);

//publish a count from 0 every specified time period

var interval = Observable.Interval(TimeSpan.FromMilliseconds(250));

//Never call “Next” but call “Complete” when the long running operation is done

varlongOperation = Observable.Start( x => ..do something that takes awhile.. );

//Generate a collection much like for (i=5, i<15, i+3) return i.ToString();

var generated = Observable.Generate(5, i => i < 15, i => i.ToString(), i => i + 3);

//simply convert an existing collection or array (IEnumerable) to IObservable

var converted = MyCollection.ToObservable();


Rx linq operators
Rx LINQ Operators

  • Where

  • Select

  • First

  • FirstOrDefault

  • Last

  • LastOrDefault

  • Single

  • Count

  • Min

  • Max

  • Sum

  • Where

  • GroupBy

  • Take

  • TakeUntil

  • Skip

  • DistinctUntilChanged

  • Buffer

  • Throttle

  • Sample

  • Delay

  • Until

  • TimeOut

  • ..etc…etc…etc…



The old way
The “Old Way”

txtSample.TextChanged += new TextChangedEventHandler(txtSample_TextChanged);             

//txtSample.TextChanged -= new TextChangedEventHandler(txtSample_TextChanged);        

private string _lastValue = string.Empty;         

voidtxtSample_TextChanged(object sender, TextChangedEventArgs e)         

{

var _currentValue = ((TextBox)sender).Text;             

if (_currentValue.Length > 5 && _currentValue != _lastValue)            

{

_lastValue = _currentValue;                 

lstData.Items.Add(_currentValue);             

}

}


The new way
The “New Way”

var _textChanged = Observable

.FromEventPattern<EventArgs>(txtSample, "TextChanged")

.Select(x => ((TextBox)x.Sender).Text);             

var _longText = _textChanged

.Where(x => x.Length > 5)

.DistinctUntilChanged()

.Throttle(TimeSpan.FromSeconds(.5));  

_longText

.ObserveOnDispatcher()

.Subscribe(x => lstData.Items.Add(x));



Additional topics1
Additional Topics

  • Threading

    • Scheduler

  • Async Pattern

  • Attaching/Detaching

  • When should I use Rx?



Additional resources
Additional Resources

  • Rx Homepage

    • http://msdn.microsoft.com/en-us/devlabs/gg577609

  • Rx Beginners Guide (Tutorials, Videos, etc)

    • http://msdn.microsoft.com/en-us/devlabs/gg577611

  • Great Keynote Overview

    • http://channel9.msdn.com/posts/DC2010T0100-Keynote-Rx-curing-your-asynchronous-programming-blues

  • Team Blog

    • http://blogs.msdn.com/b/rxteam/

  • Community Rx Wiki

    • http://rxwiki.wikidot.com/

  • Channel 9 Videos

    • http://channel9.msdn.com/tags/Rx/

  • RxSandbox

    • http://mnajder.blogspot.com/2010/03/rxsandbox-v1.html

  • Great Blog Series by Lee Campbell

    • http://leecampbell.blogspot.com/2010/08/reactive-extensions-for-net.html


Next steps
Next Steps…

[email protected]

Twitter: @kvgros


ad