2012-05-30 60 views
1

什麼是.Net Rx框架我已經閱讀了一些文章,但概念仍然不清楚。任何人都可以用一個實際的例子來解釋它。.Net中的Rx框架是什麼?

+1

這是觀察者模式簡化http://en.wikipedia.org/wiki/Observer_pattern你可以訂閱事件或任何在observablecollection中的更改,這對MVVM模式很有用。 http://haacked.com/archive/2012/04/09/reactive-extensions-sample.aspx。菲爾解釋更好,並與一個實際的例子 – jjchiw

回答

5

讓我們想象下面的情景:經過漫長的一天,你和你的朋友進入酒吧解渴。所有你想要的是幾個啤酒和一個桌子,在那裏你可以討論各種主題(地圖減少實施,gass價格等)

在統籌辦法(非處方),你會執行以下步驟:

1. Ask bartender for two beers 
2. While bartender pours the beer into the glasses you wait by the bar 
3. When bartender gives you the beers you take them and find an available table, sit, drink and discuss 

使用的Rx辦法你執行這些步驟:

1. Ask the bartender for two beers 
2. Bartender starts pouring your beers and you and your frined find an available table, sit and start discussing on various subjects 
3. When bartender finishes pouring your beer, a waitress brings the beer to your table and you start drinking it. 

現在上面可以轉化成代碼如下:

//Non Rx approach 
var beers = beerKeg.Take(2); // Here you wait for the bartender to pour the beer 
foreach(var beer in beers) // Bartender handles you the beer 
    GrabBeer(beer); 
FindAvailableTable();  // You search for an available table 
foreach(var beer in beers) // You drink your beer 
    beer.Drink(); 

//Rx approach 
var beers = beerKeg.Take(2) 
        .ToObservable() 
        .Subscribe(beer => beer.Drink()); 
// Bartender is pouring the beer but meanwhile you can search for an available table. 
// The waitress will bring beer to you. 
FindAvailableTable(); 

希望這會有所幫助。

PS:要請參閱區別使用LINQPad;執行非Rx查詢並在結果上調用Dump() - 結果將顯示在網格中。使用Rx執行相同的查詢並使用x=>x.Dump()訂閱ObservableCollection;你會看到每個元素都是單獨打印的。

+0

GR8!謝謝,很好的例子 – Deepesh

5

的Rx或無擴展名是 「LINQ事件」。 LINQ是基於IEnumerable<T>,你是通過遍歷它拉的項目從一個序列:

var items = source.Where(x => x.Name == "foobar"); 
foreach (var item in items) 
    Console.WriteLine(item); 

RX是基於IObservable<T>,你訂閱事件的序列都推到你倒數:

var events = source.Where(x => x.Name == "foobar"); 
events.Subscribe(item => Console.WriteLine(item)); 

在LINQ中,您通過使用foreach循環和pull項目來控制迭代。在Rx中,有些事情會引發事件,在準備好時會將項目推送給您。

Rx爲IObservable<T>增加了許多擴展方法,就像LINQ在IEnumerable<T>中增加了很多擴展方法一樣,使您能夠編寫非常緊湊且清晰的代碼來處理異步事件。

+0

感謝馬丁+1解釋它 – Deepesh