.NET Reactive Framework的良好介绍[关闭]


218

除Microsoft文档外,Microsoft Reactive(Rx)框架是否有很好的介绍和教程?

另外,什么是Reactive使带有常规异步编码技术难以解决的编程问题变得容易的很好的示例(带有代码)?


我一直在寻找-我需要先看很多例子,然后才能很好地了解它的最佳用途。
山姆·哈威尔

4
我住建Bing搜索的一个小演示WPF中与接收:blog.andrei.rinea.ro/2013/06/01/...
安德烈Rînea

5
我在我的博客中的一系列帖子中完全回答了这个问题:rehansaeed.co.uk/reactive-extensions-part1-replacing-events
Muhammad Rehan Saeed

Answers:


97

更新:以下博客文章已被我的在线图书www.IntroToRx.com取代。这是一本全面的19章书籍,可免费获得。您可以在网络上浏览它,或为您的kindle下载mobi版本。您也可以从亚马逊直接购买,价格不菲(约99c / 77p)。如果这本书不能满足您的需求或期望,请告诉我(作者),我们将在v2中做得更好。

感谢您链接到热门/冷门的文章。这只是整个系列的一部分,

  1. Rx简介
  2. 静态和扩展方法
  3. 终身管理–完成和取消订阅
  4. 流量控制
  5. 组合多个IObservable流
  6. 调度和线程
  7. 冷热观测
  8. 测试接收
  9. 缓冲区,窗口,联接和组联接

我将继续使用更多Rx入门资料来更新此博客。

有关更多高级内容,请访问Rx论坛(MSDN)。


7
我一直在不停地学习Rx,因为所有的学习资料都是视频形式。+1用于提供此基于文本的资源。
Daniel Schilling 2014年

枚举此链接已死。
马斯洛

2
万岁枚举此链接
全职骨架

1
我与James(EnumerateThis)合作,而他只是几年没有碰过它。他似乎没有时间或食欲来恢复它
Lee Campbell

85

这是一个Wiki网站,其中包含大量代码示例,这些示例演示了如何使用.NET Rx框架的不同功能:http : //rxwiki.wikidot.com/101samples

我发现这是目前最全面的网站,也是上手最快的网站。


12
据我所知,这个维基并没有告诉您要包​​含哪个引用。相当令人沮丧。
乔治·莫尔

umm只需添加dll并打开对象资源管理器并搜索该类。当然,Visual Studio中的右键单击上下文菜单也有帮助
Joe

62

5
+1强烈推荐这些视频,我学到了很多,还查看了Bart De Smet的一些有关IQueryable和IQbservable的视频,您可以更好地了解Rx的内部。
gideon

1
“ DevCamp 2010主题演讲”视频的完整示例项目在这里:bartdesmet.net/download/Rx40Samples.zip
Omer

16

这是一个易于使用反应式编程完成的示例,但对于经典事件却很凌乱(如果不具挑战性),它会在按下鼠标按钮时绘制线条。这是可读的,没有显式的状态处理:

var pen = new Pen(Color.Red, 3);
var graphics = this.CreateGraphics();

var mouseMoveWhileDown = 
    from md in this.GetMouseDown()
    from mv in this.GetMouseMove().Until(this.GetMouseUp())
    select new Point(mv.X, mv.Y);

mouseMoveWhileDown
    .Pairwise()
    .Subscribe(tup => graphics.DrawLine(pen, tup.Item1, tup.Item2)); 

(我必须承认在该示例中,Pairwise()是自家种植的...)

IObservable最重要的是,它是“可组合的”,就像IEnumerable一样。

我全力推荐另一个答案中提到的视频。实际上,在Channel9上有几个与此主题有关的视频:


直到从哪里来,我永远都不能使用它,我一定会缺少参考文献
TimothyP 2010年

1
@TimothyP,我认为这可能是对旧版本的回溯。那就是我自己写的(当时我正在实现IObservable扩展方法)。据我所知,最新版本的反应式扩展具有一种称为的方法TakeUntil,看起来很合适。
Benjol 2010年

这是一个很棒的例子,展示了Rx的精神。谢谢。
丹·阿布拉莫夫

您可以共享Pairwise()的实现吗?
blaster

1
@blaster,该实现如何:var pairwise = source.Zip(source.Skip(1), (x, y) => new Tuple(x, y))
MisterMetaphor







2

为了回答第二个问题,这是一个可以从Rx中受益的问题。它被称为“快速致富”。

您开发了一个同名游戏,并且销量很好。但是,仅在您的商店中可以批发。为了使现金处理更容易,您有一条流向您的传送带。

(请随时更改上面的故事:))

销售人员在其上放置一捆装订的现金,没有标签来指示一叠钞票的数量和类型。您的工作是对钱进行分类和计数。稍后,当您获得更多收入时,可以雇用其他人来帮助您。

在这种情况下,来源是一堆现金的异步来源(生产者)。您的员工和供应商期望钱,但是您必须消耗一,,拆开它们的包装,并使用自定义业务逻辑重新包装以适当地支付它们。

销售人员在自己的线程上运行,因此他们不必等待您统计他们所付出的代价。如果您被告知何时有更多的钱可以用来数钱,那么您可以最好地利用自己的时间,在此之前您可以做其他工作。

您可以用一个byte []表示每个wad。

这是现实世界中相当普遍的情况;当您从网络上检索任何资源(例如,搜索引擎的网页,图像或视频的网页)或外围设备中的数据时,就会以字节为块(可能带有标题)来获取它们。在单线程或难以使用的多线程环境中,您倾向于聚合和处理它们。不再!!


这只是一些生产者(销售人员)在同一IObserver <T>上调用OnNext,然后消费者进行订阅,但要确保它在与生产它的位置不同的线程上进行观察(OnNext)。
李·坎贝尔,





By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.