1

什么是 .Net 中的 Rx FrameWork 我已经阅读了一些关于它的文章,但概念对我来说仍然不清楚。任何人都可以用一个实际的例子来解释它。

4

3 回答 3

9

让我们想象一下以下场景:在漫长的一天之后,您和您的朋友进入一家酒吧解渴。你想要的只是几杯啤酒和一张桌子,你可以在其中讨论各种主题(map-reduce 实施、gas 价格等)

在池化方法(非 Rx)中,您将执行以下步骤:

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 执行相同的查询并订阅ObservableCollectionwith x=>x.Dump(); 您会看到每个元素都是单独打印的。

于 2012-05-30T07:39:19.117 回答
5

Rx 或 Reactive Extensions 是“LINQ to events”。LINQ 基于IEnumerable<T>通过迭代从序列中提取项目的位置:

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

IObservable<T>Rx 与您订阅推送给您的一系列事件的位置相反:

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

在 LINQ 中,您通过使用foreach循环来控制迭代并从序列中提取项目。在 Rx 中,其他东西会在它们准备好时触发事件并将项目推送给您。

Rx 增加了很多扩展方法,IObservable<T>就像 LINQ 增加了很多扩展方法一样,IEnumerable<T>可以让你编写非常紧凑和清晰的代码来处理异步事件。

于 2012-05-30T07:32:34.470 回答
2

Rx 或 Reactive Extensions 是一个使用可观察集合和 LINQ 样式查询运算符组成异步和基于事件的程序的库。

网上有很多文章,例如:

MSDN

处方药维基

视觉工作室杂志

Somasegar 的博客条目

深度介绍中的 Rx API

和我们自己的SO

请参阅在 Channel 9 上编写您的第一个 Rx 应用程序,并且,

第 9 频道 .NET 的 Rx 扩展入门

于 2012-05-30T07:17:12.370 回答