SlideShare a Scribd company logo
Reactive Extensions 
classic observer in .NET 
presenter: Sergiy Grytsenko
About presenter 
 Senior Developer @ EPAM Systems 
 17 years of programing with Basic, Pascal, Assembler, C/C++, C# 
 12 years of professional development 
 Developed several projects using Rx
Target auditory 
 UI developers that deals with asynchronous code/want responsive UI 
 Back-end developers that wish to make server async and responsive 
 You just curious about the IObservable<T> and IObserver<T>
Agenda 
 Why use Rx when we have events? 
 Key types & methods 
 Lifetime management & flow control 
 Combining several streams 
 Scheduling and Threading 
 Tests, I need unit tests!
Why use Rx when we have events? 
“To be or not to be” ©
Why Rx? 
 You demand fire-and-forget messaging 
 You want to have the result pushed to you when it is ready 
 You do not want wait for entire set to be processed before you see first one 
 Developers have tools to push data 
 Developers need tools to react to push data 
 Rx enables developers to solve problems in an elegant, familiar and 
declarative style with less code 
 It is easily to manage events and subscriptions
Why Rx? 
 Integrated 
 Unitive 
 Extensible 
 Declarative 
 Composable 
 Transformative
Why Rx? 
Useful for 
 UI events 
 Domain events 
 Infrastructure events 
 Integration events
Key types & methods 
The key to the door that you want to open
Key types & methods 
 IObservable<T> 
 IObserver<T> 
 Subjects 
 ObservableExtensions 
 Observable 
 Disposables
Key types & methods 
Disposables 
 BooleanDisposable 
 CancellationDisposable 
 CompositeDisposable 
 ContextDisposable 
 Disposable 
 MultipleAssignmentDisposable 
 RefCountDisposable 
 ScheduledDisposable 
 SerialDisposable 
 SingleAssignmentDisposable
Key types & methods 
Subscription overrides 
public static class ObservableExtensions 
{ 
public static IDisposable Subscribe<T>(this IObservable<T> source); 
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext); 
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError); 
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action onCompleted); 
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError, 
Action onCompleted); 
public static void Subscribe<T>(this IObservable<T> source, IObserver<T> observer, CancellationToken token); 
public static void Subscribe<T>(this IObservable<T> source, CancellationToken token); 
public static void Subscribe<T>(this IObservable<T> source, Action<T> onNext, CancellationToken token); 
public static void Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError, 
CancellationToken token); 
public static void Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action onCompleted, CancellationToken token); 
public static void Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError, 
Action onCompleted, CancellationToken token); 
public static IDisposable SubscribeSafe<T>(this IObservable<T> source, IObserver<T> observer); 
}
Key types & methods 
Creating observables 
 Observable.Empty<T>() 
 Observable.Return<T>(T) 
 Observable.Never<T>() 
 Observable.Throw<T>(Exception) 
 Observable.Create<T>(Func<IObserver<T>, IDisposable>) 
 IObservable<int> Observable.Range(int, int) 
 IObservalbe<long> Observable.Interval(TimeSpan); 
 Observable.Start<T/Unit>(Func<T>/Action) 
 ToObservable<T>(IEnumerable<T>) 
 Observalble.Generate(initialState, condition, iterate, resultSelector)
Key types & methods 
Subjects 
 Subject.Create(observer, observable) 
 Subject<T> 
 AsyncSubject<T> 
 BehaviorSubject<T> 
 ReplaySubject<T>
Lifetime management & flow 
control 
Build your own pipe & valve system
Lifetime management & flow control 
Subscription lifetime 
 There is many Subscribe overloads but no Unsubscribe method 
 Rx returns IDisposable whenever subscription takes place 
 Or you can provide CancellationToken to unsubscribe 
 Think of IDisposable as subscription token 
 You can call Subscribe many times on single IObservable
Lifetime management & flow control 
Observable lifetime 
 Both OnError & OnCompleted signify the completion of a stream 
 No futher calls to OnNext can be performed 
 When stream completes or errors, you should still dispose subscription
Lifetime management & flow control 
Flow control 
 OnError publishes exception, not thows 
 Subscribe w/o OnError handler causes exception to throw
Lifetime management & flow control 
Visualization 
 Stream that publishes 3 values and then completes 
 Stream that publishes 4 values and then errors
Lifetime management & flow control 
Constructs 
 Retry<T>(this IObservable<T> source) 
 OnErrorResumeNext<T>(this IObservable<T> source, IObservable<T> next) 
 Catch(this IObservable<T> source, Func<TException, IObservalbe<T>> next)
Lifetime management & flow control 
Constructs 
 Materialize/Dematerialize 
 Do/Run
Combining several streams 
So many combinations…
Combining several streams 
Transfer from one stream 
 Concat 
 Amb (short for Abmiguous)
Combining several streams 
 Merge 
 SelectMany(other, selector) 
 Zip(other, selector)
Combining several streams 
 CombineLatest 
 ForkJoin
Scheduling and Threading 
effectively remove the need for WaitHandles, and any explicit calls to 
using Threads, the ThreadPool and the new shiny Task type
Scheduling and Threading 
 The invocation of the subscription 
 The publishing of notifications 
public static class Observable 
{ 
public static IObservable<TSource> ObserveOn<TSource>( 
this IObservable<TSource> source, IScheduler scheduler) 
{...} 
public static IObservable<TSource> SubscribeOn<TSource>( 
this IObservable<TSource> source, IScheduler scheduler) 
{...} 
}
Scheduling and Threading 
public interface IScheduler 
{ 
IDisposable Schedule(Action action); 
IDisposable Schedule(Action action, TimeSpan dueTime); 
DateTimeOffset Now { get; } 
}
Scheduling and Threading 
 Scheduler.Dispatcher 
 Scheduler.NewThread 
 Scheduler.ThreadPool 
 Scheduler.TaskPool 
 Scheduler.Immediate 
 Scheduler.CurrentThread
Tests, I need unit tests! 
Mastering time…
Tests, I need unit tests! 
 Scheduling and therefore Threading are generally avoided in test scenarios 
as they can introduce race conditions which may lead to non-deterministic 
tests. 
 Tests should run as fast as possible. 
 Rx is a new technology/library so naturally as we master it, we will refactor 
our code. We want to use to tests to ensure our refactoring have not 
altered the internal behavior of our code base.
Tests, I need unit tests! 
TestScheduler 
 A virtual scheduler to allow us emulate and control time. 
var scheduler = new TestScheduler(); 
var wasExecuted = false; 
scheduler.Schedule(() => wasExecuted = true); 
Assert.IsFalse(wasExecuted); 
scheduler.AdvanceTo(1); //execute 1 tick of queued actions 
Assert.IsTrue(wasExecuted);
Tests, I need unit tests! 
TestScheduler 
var scheduler = new TestScheduler(); 
var dueTime = TimeSpan.FromMilliseconds(400); 
var delta = TimeSpan.FromMilliseconds(100); 
scheduler.Schedule(dueTime, () => Console.WriteLine("1")); 
scheduler.Schedule(dueTime, () => Console.WriteLine("2")); 
scheduler.Schedule(dueTime.Add(delta), () => Console.WriteLine("3")); 
scheduler.Schedule(dueTime.Add(delta), () => Console.WriteLine("4")); 
Console.WriteLine("RunTo(dueTime)"); 
scheduler.AdvanceTo(dueTime.Ticks); 
Console.WriteLine("Run()"); 
scheduler.Start(); 
/* Output: 
RunTo(dueTime) 
1 
2 
Run() 
3 
4 
*/
Useful links 
 IObservable<T> interface – MSDN 
 IObserver<T> interface – MSDN 
 Observer Design pattern - MSDN 
 Rx Home http://msdn.microsoft.com/en-us/devlabs/gg577609 
 Exploring the Major Interfaces in Rx – MSDN 
 ObservableExtensions class - MSDN 
 Using Rx Subjects - MSDN 
 System.Reactive.Subjects Namespace - MSDN 
 Subject<T> - MSDN 
 AsyncSubject<T> - MSDN 
 BehaviorSubject<T> - MSDN 
 ReplaySubject<T> - MSDN 
 Subject static class - MSDN 
 ISubject<TSource, TResult> - MSDN 
 ISubject<T> - MSDN
Useful links 
 Observable class - MSDN 
 Observer class - MSDN 
 Qservable class - MSDN 
 The Rx Wiki site 101 Samples http://rxwiki.wikidot.com/101samples 
 http://channel9.msdn.com/shows/Going+Deep/Wes-Dyer-and-Jeffrey- 
Van-Gogh-Inside-Rx-Virtual-Time/ 
 http://channel9.msdn.com/posts/J.Van.Gogh/Rx-API-in-depth-Hot-and- 
Cold-observables/ 
 http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/13/rx-for-beginners- 
part-9-hot-vs-cold-observable.aspx
Useful links 
 http://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-MinLINQ-The- 
Essence-of-LINQ 
 http://leecampbell.blogspot.com/2010/08/reactive-extensions-for-net.html 
 http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9- 
August-17-2012 
 http://channel9.msdn.com/Series/Rx-Workshop 
 http://channel9.msdn.com/Blogs/J.Van.Gogh 
 http://channel9.msdn.com/Blogs/Charles/Erik-Meijer-Rx-in-15-Minutes 
 http://channel9.msdn.com/Blogs/Peli/Testing-Rx-with-Pex

More Related Content

What's hot

Parallel Programming With Dot Net
Parallel Programming With Dot NetParallel Programming With Dot Net
Parallel Programming With Dot Net
Neeraj Kaushik
 
Modern Java Workshop
Modern Java WorkshopModern Java Workshop
Modern Java Workshop
Simon Ritter
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJava
Sanjay Acharya
 
RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015
Constantine Mars
 
An Experiment with Checking the glibc Library
An Experiment with Checking the glibc LibraryAn Experiment with Checking the glibc Library
An Experiment with Checking the glibc Library
Andrey Karpov
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
Dustin Graham
 
bluespec talk
bluespec talkbluespec talk
bluespec talk
Suman Karumuri
 
Reactive Programming no Android
Reactive Programming no AndroidReactive Programming no Android
Reactive Programming no Android
Guilherme Branco
 
Introduction to RxJS
Introduction to RxJSIntroduction to RxJS
Introduction to RxJS
Brainhub
 
Java 8 Intro - Core Features
Java 8 Intro - Core FeaturesJava 8 Intro - Core Features
Java 8 Intro - Core Features
GlobalLogic Ukraine
 
GKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroidGKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroid
GDG Korea
 
Streaming Dataflow with Apache Flink
Streaming Dataflow with Apache Flink Streaming Dataflow with Apache Flink
Streaming Dataflow with Apache Flink
huguk
 
Example First / A Sane Test-Driven Approach to Programming
Example First / A Sane Test-Driven Approach to ProgrammingExample First / A Sane Test-Driven Approach to Programming
Example First / A Sane Test-Driven Approach to Programming
Jonathan Acker
 
Reactive Programming on Android
Reactive Programming on AndroidReactive Programming on Android
Reactive Programming on Android
Guilherme Branco
 
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...julien.ponge
 
How to Think in RxJava Before Reacting
How to Think in RxJava Before ReactingHow to Think in RxJava Before Reacting
How to Think in RxJava Before Reacting
IndicThreads
 
Intro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidIntro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich Android
Egor Andreevich
 
Software Testing - Invited Lecture at UNSW Sydney
Software Testing - Invited Lecture at UNSW SydneySoftware Testing - Invited Lecture at UNSW Sydney
Software Testing - Invited Lecture at UNSW Sydneyjulien.ponge
 
Parallel streams in java 8
Parallel streams in java 8Parallel streams in java 8
Parallel streams in java 8
David Gómez García
 

What's hot (20)

Parallel Programming With Dot Net
Parallel Programming With Dot NetParallel Programming With Dot Net
Parallel Programming With Dot Net
 
Modern Java Workshop
Modern Java WorkshopModern Java Workshop
Modern Java Workshop
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJava
 
RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015
 
An Experiment with Checking the glibc Library
An Experiment with Checking the glibc LibraryAn Experiment with Checking the glibc Library
An Experiment with Checking the glibc Library
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
 
bluespec talk
bluespec talkbluespec talk
bluespec talk
 
Reactive Programming no Android
Reactive Programming no AndroidReactive Programming no Android
Reactive Programming no Android
 
Introduction to RxJS
Introduction to RxJSIntroduction to RxJS
Introduction to RxJS
 
Java 8 Intro - Core Features
Java 8 Intro - Core FeaturesJava 8 Intro - Core Features
Java 8 Intro - Core Features
 
GKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroidGKAC 2015 Apr. - RxAndroid
GKAC 2015 Apr. - RxAndroid
 
Streaming Dataflow with Apache Flink
Streaming Dataflow with Apache Flink Streaming Dataflow with Apache Flink
Streaming Dataflow with Apache Flink
 
Example First / A Sane Test-Driven Approach to Programming
Example First / A Sane Test-Driven Approach to ProgrammingExample First / A Sane Test-Driven Approach to Programming
Example First / A Sane Test-Driven Approach to Programming
 
Reactive Programming on Android
Reactive Programming on AndroidReactive Programming on Android
Reactive Programming on Android
 
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
Java 7 Launch Event at LyonJUG, Lyon France. Fork / Join framework and Projec...
 
Java 7 LavaJUG
Java 7 LavaJUGJava 7 LavaJUG
Java 7 LavaJUG
 
How to Think in RxJava Before Reacting
How to Think in RxJava Before ReactingHow to Think in RxJava Before Reacting
How to Think in RxJava Before Reacting
 
Intro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidIntro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich Android
 
Software Testing - Invited Lecture at UNSW Sydney
Software Testing - Invited Lecture at UNSW SydneySoftware Testing - Invited Lecture at UNSW Sydney
Software Testing - Invited Lecture at UNSW Sydney
 
Parallel streams in java 8
Parallel streams in java 8Parallel streams in java 8
Parallel streams in java 8
 

Similar to Reactive Extensions: classic Observer in .NET

Rx workshop
Rx workshopRx workshop
Rx workshop
Ryan Riley
 
RxJava@Android
RxJava@AndroidRxJava@Android
RxJava@Android
Maxim Volgin
 
Testing time and concurrency Rx
Testing time and concurrency RxTesting time and concurrency Rx
Testing time and concurrency Rx
Tamir Dresher
 
Observability foundations in dynamically evolving architectures
Observability foundations in dynamically evolving architecturesObservability foundations in dynamically evolving architectures
Observability foundations in dynamically evolving architectures
Boyan Dimitrov
 
WSO2 Product Release Webinar: WSO2 Complex Event Processor 4.0
WSO2 Product Release Webinar: WSO2 Complex Event Processor 4.0WSO2 Product Release Webinar: WSO2 Complex Event Processor 4.0
WSO2 Product Release Webinar: WSO2 Complex Event Processor 4.0
WSO2
 
Integration-Monday-Stateful-Programming-Models-Serverless-Functions
Integration-Monday-Stateful-Programming-Models-Serverless-FunctionsIntegration-Monday-Stateful-Programming-Models-Serverless-Functions
Integration-Monday-Stateful-Programming-Models-Serverless-Functions
BizTalk360
 
RxJava 2 Reactive extensions for the JVM
RxJava 2  Reactive extensions for the JVMRxJava 2  Reactive extensions for the JVM
RxJava 2 Reactive extensions for the JVM
Netesh Kumar
 
Who killed object oriented design?
Who killed object oriented design?Who killed object oriented design?
Who killed object oriented design?
Amir Barylko
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
Rick Warren
 
Rx 101 - Tamir Dresher - Copenhagen .NET User Group
Rx 101  - Tamir Dresher - Copenhagen .NET User GroupRx 101  - Tamir Dresher - Copenhagen .NET User Group
Rx 101 - Tamir Dresher - Copenhagen .NET User Group
Tamir Dresher
 
Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2
JollyRogers5
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
Dmitri Nesteruk
 
Design for Testability
Design for TestabilityDesign for Testability
Design for Testability
Stefano Dalla Palma
 
Timely Year Two: Lessons Learned Building a Scalable Metrics Analytic System
Timely Year Two: Lessons Learned Building a Scalable Metrics Analytic SystemTimely Year Two: Lessons Learned Building a Scalable Metrics Analytic System
Timely Year Two: Lessons Learned Building a Scalable Metrics Analytic System
Accumulo Summit
 
Mario Fusco - Reactive programming in Java - Codemotion Milan 2017
Mario Fusco - Reactive programming in Java - Codemotion Milan 2017Mario Fusco - Reactive programming in Java - Codemotion Milan 2017
Mario Fusco - Reactive programming in Java - Codemotion Milan 2017
Codemotion
 
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache BeamGDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
Imre Nagi
 
Introduction to reactive programming
Introduction to reactive programmingIntroduction to reactive programming
Introduction to reactive programming
Leapfrog Technology Inc.
 
Advanced patterns in asynchronous programming
Advanced patterns in asynchronous programmingAdvanced patterns in asynchronous programming
Advanced patterns in asynchronous programming
Michael Arenzon
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf
hamzadamani7
 

Similar to Reactive Extensions: classic Observer in .NET (20)

Rx workshop
Rx workshopRx workshop
Rx workshop
 
RxJava@Android
RxJava@AndroidRxJava@Android
RxJava@Android
 
Testing time and concurrency Rx
Testing time and concurrency RxTesting time and concurrency Rx
Testing time and concurrency Rx
 
Observability foundations in dynamically evolving architectures
Observability foundations in dynamically evolving architecturesObservability foundations in dynamically evolving architectures
Observability foundations in dynamically evolving architectures
 
WSO2 Product Release Webinar: WSO2 Complex Event Processor 4.0
WSO2 Product Release Webinar: WSO2 Complex Event Processor 4.0WSO2 Product Release Webinar: WSO2 Complex Event Processor 4.0
WSO2 Product Release Webinar: WSO2 Complex Event Processor 4.0
 
Integration-Monday-Stateful-Programming-Models-Serverless-Functions
Integration-Monday-Stateful-Programming-Models-Serverless-FunctionsIntegration-Monday-Stateful-Programming-Models-Serverless-Functions
Integration-Monday-Stateful-Programming-Models-Serverless-Functions
 
RxJava 2 Reactive extensions for the JVM
RxJava 2  Reactive extensions for the JVMRxJava 2  Reactive extensions for the JVM
RxJava 2 Reactive extensions for the JVM
 
Who killed object oriented design?
Who killed object oriented design?Who killed object oriented design?
Who killed object oriented design?
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
Rx 101 - Tamir Dresher - Copenhagen .NET User Group
Rx 101  - Tamir Dresher - Copenhagen .NET User GroupRx 101  - Tamir Dresher - Copenhagen .NET User Group
Rx 101 - Tamir Dresher - Copenhagen .NET User Group
 
Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2
 
CP 04.pptx
CP 04.pptxCP 04.pptx
CP 04.pptx
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
Design for Testability
Design for TestabilityDesign for Testability
Design for Testability
 
Timely Year Two: Lessons Learned Building a Scalable Metrics Analytic System
Timely Year Two: Lessons Learned Building a Scalable Metrics Analytic SystemTimely Year Two: Lessons Learned Building a Scalable Metrics Analytic System
Timely Year Two: Lessons Learned Building a Scalable Metrics Analytic System
 
Mario Fusco - Reactive programming in Java - Codemotion Milan 2017
Mario Fusco - Reactive programming in Java - Codemotion Milan 2017Mario Fusco - Reactive programming in Java - Codemotion Milan 2017
Mario Fusco - Reactive programming in Java - Codemotion Milan 2017
 
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache BeamGDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
 
Introduction to reactive programming
Introduction to reactive programmingIntroduction to reactive programming
Introduction to reactive programming
 
Advanced patterns in asynchronous programming
Advanced patterns in asynchronous programmingAdvanced patterns in asynchronous programming
Advanced patterns in asynchronous programming
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf
 

More from EPAM

JavaScript. Code Quality.
JavaScript. Code Quality.JavaScript. Code Quality.
JavaScript. Code Quality.
EPAM
 
Continuous integration for JavaScript projects
Continuous integration for JavaScript projectsContinuous integration for JavaScript projects
Continuous integration for JavaScript projects
EPAM
 
Visualization of Big Data in Web Apps
Visualization of Big Data in Web AppsVisualization of Big Data in Web Apps
Visualization of Big Data in Web Apps
EPAM
 
Object Oriented Concepts in Real Projects
Object Oriented Concepts in Real ProjectsObject Oriented Concepts in Real Projects
Object Oriented Concepts in Real Projects
EPAM
 
Modern web applications infrastructure
Modern web applications infrastructureModern web applications infrastructure
Modern web applications infrastructure
EPAM
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
EPAM
 
Future of the Future of E-Commerce
Future of the Future of E-CommerceFuture of the Future of E-Commerce
Future of the Future of E-Commerce
EPAM
 
Bootify Yyour App from Zero to Hero
Bootify Yyour App from Zero to HeroBootify Yyour App from Zero to Hero
Bootify Yyour App from Zero to Hero
EPAM
 
Responsive Web in Brief
Responsive Web in BriefResponsive Web in Brief
Responsive Web in Brief
EPAM
 

More from EPAM (9)

JavaScript. Code Quality.
JavaScript. Code Quality.JavaScript. Code Quality.
JavaScript. Code Quality.
 
Continuous integration for JavaScript projects
Continuous integration for JavaScript projectsContinuous integration for JavaScript projects
Continuous integration for JavaScript projects
 
Visualization of Big Data in Web Apps
Visualization of Big Data in Web AppsVisualization of Big Data in Web Apps
Visualization of Big Data in Web Apps
 
Object Oriented Concepts in Real Projects
Object Oriented Concepts in Real ProjectsObject Oriented Concepts in Real Projects
Object Oriented Concepts in Real Projects
 
Modern web applications infrastructure
Modern web applications infrastructureModern web applications infrastructure
Modern web applications infrastructure
 
SOLID Principles in the real world
SOLID Principles in the real worldSOLID Principles in the real world
SOLID Principles in the real world
 
Future of the Future of E-Commerce
Future of the Future of E-CommerceFuture of the Future of E-Commerce
Future of the Future of E-Commerce
 
Bootify Yyour App from Zero to Hero
Bootify Yyour App from Zero to HeroBootify Yyour App from Zero to Hero
Bootify Yyour App from Zero to Hero
 
Responsive Web in Brief
Responsive Web in BriefResponsive Web in Brief
Responsive Web in Brief
 

Recently uploaded

E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
Neo4j
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
Rakesh Kumar R
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
Octavian Nadolu
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
Max Andersen
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
lorraineandreiamcidl
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Crescat
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
Łukasz Chruściel
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
Ayan Halder
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
Drona Infotech
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
Hironori Washizaki
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
Google
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
Alina Yurenko
 

Recently uploaded (20)

E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
 
Quarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden ExtensionsQuarkus Hidden and Forbidden Extensions
Quarkus Hidden and Forbidden Extensions
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
 

Reactive Extensions: classic Observer in .NET

  • 1. Reactive Extensions classic observer in .NET presenter: Sergiy Grytsenko
  • 2. About presenter  Senior Developer @ EPAM Systems  17 years of programing with Basic, Pascal, Assembler, C/C++, C#  12 years of professional development  Developed several projects using Rx
  • 3. Target auditory  UI developers that deals with asynchronous code/want responsive UI  Back-end developers that wish to make server async and responsive  You just curious about the IObservable<T> and IObserver<T>
  • 4. Agenda  Why use Rx when we have events?  Key types & methods  Lifetime management & flow control  Combining several streams  Scheduling and Threading  Tests, I need unit tests!
  • 5. Why use Rx when we have events? “To be or not to be” ©
  • 6. Why Rx?  You demand fire-and-forget messaging  You want to have the result pushed to you when it is ready  You do not want wait for entire set to be processed before you see first one  Developers have tools to push data  Developers need tools to react to push data  Rx enables developers to solve problems in an elegant, familiar and declarative style with less code  It is easily to manage events and subscriptions
  • 7. Why Rx?  Integrated  Unitive  Extensible  Declarative  Composable  Transformative
  • 8. Why Rx? Useful for  UI events  Domain events  Infrastructure events  Integration events
  • 9. Key types & methods The key to the door that you want to open
  • 10. Key types & methods  IObservable<T>  IObserver<T>  Subjects  ObservableExtensions  Observable  Disposables
  • 11. Key types & methods Disposables  BooleanDisposable  CancellationDisposable  CompositeDisposable  ContextDisposable  Disposable  MultipleAssignmentDisposable  RefCountDisposable  ScheduledDisposable  SerialDisposable  SingleAssignmentDisposable
  • 12. Key types & methods Subscription overrides public static class ObservableExtensions { public static IDisposable Subscribe<T>(this IObservable<T> source); public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext); public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError); public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action onCompleted); public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError, Action onCompleted); public static void Subscribe<T>(this IObservable<T> source, IObserver<T> observer, CancellationToken token); public static void Subscribe<T>(this IObservable<T> source, CancellationToken token); public static void Subscribe<T>(this IObservable<T> source, Action<T> onNext, CancellationToken token); public static void Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError, CancellationToken token); public static void Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action onCompleted, CancellationToken token); public static void Subscribe<T>(this IObservable<T> source, Action<T> onNext, Action<Exception> onError, Action onCompleted, CancellationToken token); public static IDisposable SubscribeSafe<T>(this IObservable<T> source, IObserver<T> observer); }
  • 13. Key types & methods Creating observables  Observable.Empty<T>()  Observable.Return<T>(T)  Observable.Never<T>()  Observable.Throw<T>(Exception)  Observable.Create<T>(Func<IObserver<T>, IDisposable>)  IObservable<int> Observable.Range(int, int)  IObservalbe<long> Observable.Interval(TimeSpan);  Observable.Start<T/Unit>(Func<T>/Action)  ToObservable<T>(IEnumerable<T>)  Observalble.Generate(initialState, condition, iterate, resultSelector)
  • 14. Key types & methods Subjects  Subject.Create(observer, observable)  Subject<T>  AsyncSubject<T>  BehaviorSubject<T>  ReplaySubject<T>
  • 15. Lifetime management & flow control Build your own pipe & valve system
  • 16. Lifetime management & flow control Subscription lifetime  There is many Subscribe overloads but no Unsubscribe method  Rx returns IDisposable whenever subscription takes place  Or you can provide CancellationToken to unsubscribe  Think of IDisposable as subscription token  You can call Subscribe many times on single IObservable
  • 17. Lifetime management & flow control Observable lifetime  Both OnError & OnCompleted signify the completion of a stream  No futher calls to OnNext can be performed  When stream completes or errors, you should still dispose subscription
  • 18. Lifetime management & flow control Flow control  OnError publishes exception, not thows  Subscribe w/o OnError handler causes exception to throw
  • 19. Lifetime management & flow control Visualization  Stream that publishes 3 values and then completes  Stream that publishes 4 values and then errors
  • 20. Lifetime management & flow control Constructs  Retry<T>(this IObservable<T> source)  OnErrorResumeNext<T>(this IObservable<T> source, IObservable<T> next)  Catch(this IObservable<T> source, Func<TException, IObservalbe<T>> next)
  • 21. Lifetime management & flow control Constructs  Materialize/Dematerialize  Do/Run
  • 22. Combining several streams So many combinations…
  • 23. Combining several streams Transfer from one stream  Concat  Amb (short for Abmiguous)
  • 24. Combining several streams  Merge  SelectMany(other, selector)  Zip(other, selector)
  • 25. Combining several streams  CombineLatest  ForkJoin
  • 26. Scheduling and Threading effectively remove the need for WaitHandles, and any explicit calls to using Threads, the ThreadPool and the new shiny Task type
  • 27. Scheduling and Threading  The invocation of the subscription  The publishing of notifications public static class Observable { public static IObservable<TSource> ObserveOn<TSource>( this IObservable<TSource> source, IScheduler scheduler) {...} public static IObservable<TSource> SubscribeOn<TSource>( this IObservable<TSource> source, IScheduler scheduler) {...} }
  • 28. Scheduling and Threading public interface IScheduler { IDisposable Schedule(Action action); IDisposable Schedule(Action action, TimeSpan dueTime); DateTimeOffset Now { get; } }
  • 29. Scheduling and Threading  Scheduler.Dispatcher  Scheduler.NewThread  Scheduler.ThreadPool  Scheduler.TaskPool  Scheduler.Immediate  Scheduler.CurrentThread
  • 30. Tests, I need unit tests! Mastering time…
  • 31. Tests, I need unit tests!  Scheduling and therefore Threading are generally avoided in test scenarios as they can introduce race conditions which may lead to non-deterministic tests.  Tests should run as fast as possible.  Rx is a new technology/library so naturally as we master it, we will refactor our code. We want to use to tests to ensure our refactoring have not altered the internal behavior of our code base.
  • 32. Tests, I need unit tests! TestScheduler  A virtual scheduler to allow us emulate and control time. var scheduler = new TestScheduler(); var wasExecuted = false; scheduler.Schedule(() => wasExecuted = true); Assert.IsFalse(wasExecuted); scheduler.AdvanceTo(1); //execute 1 tick of queued actions Assert.IsTrue(wasExecuted);
  • 33. Tests, I need unit tests! TestScheduler var scheduler = new TestScheduler(); var dueTime = TimeSpan.FromMilliseconds(400); var delta = TimeSpan.FromMilliseconds(100); scheduler.Schedule(dueTime, () => Console.WriteLine("1")); scheduler.Schedule(dueTime, () => Console.WriteLine("2")); scheduler.Schedule(dueTime.Add(delta), () => Console.WriteLine("3")); scheduler.Schedule(dueTime.Add(delta), () => Console.WriteLine("4")); Console.WriteLine("RunTo(dueTime)"); scheduler.AdvanceTo(dueTime.Ticks); Console.WriteLine("Run()"); scheduler.Start(); /* Output: RunTo(dueTime) 1 2 Run() 3 4 */
  • 34. Useful links  IObservable<T> interface – MSDN  IObserver<T> interface – MSDN  Observer Design pattern - MSDN  Rx Home http://msdn.microsoft.com/en-us/devlabs/gg577609  Exploring the Major Interfaces in Rx – MSDN  ObservableExtensions class - MSDN  Using Rx Subjects - MSDN  System.Reactive.Subjects Namespace - MSDN  Subject<T> - MSDN  AsyncSubject<T> - MSDN  BehaviorSubject<T> - MSDN  ReplaySubject<T> - MSDN  Subject static class - MSDN  ISubject<TSource, TResult> - MSDN  ISubject<T> - MSDN
  • 35. Useful links  Observable class - MSDN  Observer class - MSDN  Qservable class - MSDN  The Rx Wiki site 101 Samples http://rxwiki.wikidot.com/101samples  http://channel9.msdn.com/shows/Going+Deep/Wes-Dyer-and-Jeffrey- Van-Gogh-Inside-Rx-Virtual-Time/  http://channel9.msdn.com/posts/J.Van.Gogh/Rx-API-in-depth-Hot-and- Cold-observables/  http://blogs.microsoft.co.il/blogs/bnaya/archive/2010/03/13/rx-for-beginners- part-9-hot-vs-cold-observable.aspx
  • 36. Useful links  http://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-MinLINQ-The- Essence-of-LINQ  http://leecampbell.blogspot.com/2010/08/reactive-extensions-for-net.html  http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9- August-17-2012  http://channel9.msdn.com/Series/Rx-Workshop  http://channel9.msdn.com/Blogs/J.Van.Gogh  http://channel9.msdn.com/Blogs/Charles/Erik-Meijer-Rx-in-15-Minutes  http://channel9.msdn.com/Blogs/Peli/Testing-Rx-with-Pex

Editor's Notes

  1. LINQ integrated. You can unite .NET event, an async method call, a Task<T> or 3rd party API into single paradigm. You can write your own query operators/extension methods. Declaration of what your code does and leaves the how to the operators. Queries can be composed together to further produce composite queries. Query can transform from one type to another, translate one value to another, aggregate sequence or expand single value to a sequence of values.
  2. UI events like mouse move/click/down/up, button click or other control’s events Domain events like property change, collection update or business logic events Infrastructure events from FileWatcher, system or WMI Integration events: broadcast from bessage bus, push event from WebSockets API or other low latency middleware
  3. Create - Creates a subject from the specified observer and observable. Subject - Represents an object that is both an observable sequence as well as an observer. Each notification is broadcasted to all subscribed observers. AsyncSubject - Represents the result of an asynchronous operation. The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers. BehaviorSubject - Represents a value that changes over time. Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications. ReplaySubject - Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies. (Remembers all publications)
  4. Materialize flatten 3 types of publications to stream of Notification<T> Dematerialize converts stream of notifications to IObservable<T> Do executes provided action and returns same observable Run returns void and it is a blocking call
  5. Concat – passes first then (when first completes) passes second Amb – passes values from stream that first produce value
  6. Merge – merges two or more streams passes by all values SelectMany – provides Cartesian product of two streams Zip – takes two values from both streams and returns one
  7. CombineLatest – combines latest two values from both streams in time ForkJoin – produces the one last combination of two values