.NET 响应式框架简介

224

除了微软的文档,是否有一份关于Microsoft Reactive (Rx)框架的良好介绍和教程?

此外,有没有一个好的例子(附代码),展示使用传统异步编码技术解决困难编程问题相比之下,Reactive更容易解决?


我一直在寻找 - 在我对它的最佳用途有一个好的想法之前,我需要看到很多例子。 - Sam Harwell
4
我在WPF中使用Rx构建了一个小型的Bing搜索演示:http://blog.andrei.rinea.ro/2013/06/01/bing-it-on-reactive-extensions-story-code-and-slides/。 - Andrei Rînea
5
我在我的博客系列文章中准确回答了这个问题:http://rehansaeed.co.uk/reactive-extensions-part1-replacing-events/ - Muhammad Rehan Saeed
16个回答

103
更新: 下面的博客文章已被我在线书籍www.IntroToRx.com所取代。这是一本全面的19章免费书籍。您可以在网上浏览它,或下载适用于您的Kindle的mobi版本。您也可以直接从Amazon以微小的费用(~99c/77p)获取它。如果这本书不能满足您的需求或期望,请让我(作者)知道,我们将为v2做得更好。

感谢您提供Hot/Cold帖子的链接。这只是完整系列的一部分,

  1. Rx简介
  2. 静态和扩展方法
  3. 生命周期管理-完成和取消订阅
  4. 流控制
  5. 组合多个IObservable流
  6. 调度和线程
  7. 热和冷的可观察对象
  8. Rx测试
  9. 缓冲、窗口、连接和组连接

我将继续更新此博客,发布更多Rx入门内容。

对于更高级的内容,您可以去Rx论坛(MSDN)。


7
我迟迟未学习Rx,因为所有的学习资料都是视频形式。感谢提供这种基于文本的资源,加分了。 - Daniel Schilling
枚举此链接已失效。 - Maslow
2
永远长存的枚举此链接 - Full Time Skeleton
1
我和詹姆斯(EnumerateThis)一起工作,但他已经多年没有碰它了。他似乎没有时间或兴趣来重新启动它。 - Lee Campbell

85
这是一个维基站点,其中有许多代码示例,演示如何使用.NET Rx框架的不同功能:http://rxwiki.wikidot.com/101samples
我发现这是目前最全面的站点,并且是最快开始使用的站点。

12
就我所知,这个维基并没有告诉你应该包含哪些参考资料,这让人感到有点...令人沮丧。 - George Mauer
只需添加DLL并打开对象浏览器,搜索类即可。当然,在Visual Studio中右键单击上下文菜单也很有帮助。 - Joe

63

5
强烈推荐这些视频,我学到了很多。还要看一下Bart De Smet关于IQueryable和IQbservable的一些视频,你将更好地理解Rx的内部机制。 - gideon
1
"DevCamp 2010主题演讲"视频的完整示例项目在此处:http://www.bartdesmet.net/download/Rx40Samples.zip" - Omer Raviv

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 上有几个关于这个主题的不同视频:


1
@TimothyP,我认为这可能是对旧版本的回溯。或者是我自己写的(当时我正在尝试实现IObservable扩展方法)。从我所看到的来看,最新版本的响应式扩展有一个名为“TakeUntil”的方法,看起来很合适。 - Benjol
这是一个展示 Rx 精神的绝佳示例。谢谢。 - Dan Abramov
你能分享一下Pairwise()的实现吗? - blaster
哦,@blaster,那是一个棘手的问题。我会看看能否找到它,如果找不到,我会看看我的生疏大脑是否能够重新创造它! - Benjol
1
@blaster,这个实现怎么样:var pairwise = source.Zip(source.Skip(1), (x, y) => new Tuple(x, y)) - MisterMetaphor
显示剩余2条评论

12

5

4

4

3

使用Rx Sandbox进行操作,可以直观地了解各种组合器的含义。这是我见过最好的学习工具。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接