Because our legacy apps are behaving like this.
Reactive extensions library is used for
- composing events
- orchestrating data flows
- bring light to callback hell


State

public interface IObservable<out T>
{
IDisposable Subscribe(IObserver<T> observer);
}
public interface IObserver<in T>
{
void OnNext(T item);
void OnCompleted();
void OnError(Exception error);
}OnNext* (OnCompleted | OnError)?
sync:
async:
One
Many
T
Task<T>
IObservable<T>
IEnumerable<T>

observable.Subscribe(observer);Observables for representing asynchronous data streams
Linq for quering and transforming data
Schedulers for concurrency


Observable
.Return("hello world")
.Subscribe(message => Console.WriteLine(message));
Observable.Create<string>(observer =>
{
observer.OnNext("test1");
observer.OnNext("test2");
observer.OnCompleted();
return Disposable.Empty;
}).Subscribe(message => Console.WriteLine(message));
new int[] { 1, 2, 3 }
.ToObservable()
.Subscribe(number => Console.WriteLine(number));SELECT name FROM studentsSELECT name
FROM students
WHERE phoneNumber = "0722334455"map :
filter :
students
.Select(student => student.Name)
.Subscribe(name => Console.WriteLine(name))map:
students
.Where(student =>
student.PhoneNumber == "0722334455")
.Subscribe(student =>
Console.WriteLine(student.Name))filter:
var textChanged =
from evt in Observable.FromEvent<EventArgs>(txt, "TextChanged")
select ((TextBox)evt.Sender).Text;
var input = textChanged
.Throttle(TimeSpan.FromSeconds(1))
.DistinctUntilChanged();
var webServiceClient = new HttpClient("http://..");
var searchOnWebService = Observable.FromAsync(webService.SearchAsync);
var results = from term in input
from webResults in searchOnWebService.TakeUntil(input)
select webResults 
Observable.Create(observer => {
printCurrentThread();
observer.OnNext("hello"); })
.SubscribeOn(Schedulers.Immediate)
.ObserveOn(Schedulers.ThreadPool)
.Subscribe(message => {
printCurrentThread();
Console.WriteLine(message); });