1 / 27

Reactive Extensions (Rx) Explained

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

hosea
Download Presentation

Reactive Extensions (Rx) Explained

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Reactive Extensions (Rx) Explained Presenter: Kevin Grossnicklaus August 5th, 2011

  2. Agenda • Introductions • Talk • Additional Resources • Conclusion

  3. 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: kvgros@architectnow.net • Twitter: @kvgros • Blog: blog.architectnow.net

  4. Expectations

  5. 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

  6. Introduction to Rx

  7. IEnumerable/IEnumerator interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); } interface IEnumerator<T> : IDisposable { boolMoveNext(); T Current { get; } void Reset(); }

  8. 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

  9. 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(); }

  10. 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();

  11. 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

  12. Observable Extensions

  13. 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();

  14. 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); }

  15. 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"); });

  16. 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();

  17. 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…

  18. RX and .NET EVENTS

  19. 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);              } }

  20. 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));

  21. Additional Topics

  22. Additional Topics • Threading • Scheduler • Async Pattern • Attaching/Detaching • When should I use Rx?

  23. Final Thoughts

  24. 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

  25. Next Steps… kvgros@architectnow.net Twitter: @kvgros

More Related