![]() |
1
35
可以将iobservable用作事件,用iobservable类型的属性替换公开事件的代码,但这并不是重点。 要理解IOBServable有两个重要方面:
这是我今天下午上班时遇到的一个例子。 在Silverlight中,您可以将某些效果应用于无法应用于普通控件的图像控件。为了在控件内容更改时绕过这些限制,我可以等待控件的视觉外观更新,并对其进行屏幕截图。然后我想隐藏它的视觉表示,用快照替换它,并将视觉效果应用于图像。现在我可以将图像效果应用于控件(假设它不是交互式的)。 这个程序很简单,但它必须是异步的。在对图像应用效果之前,必须等待两个连续的异步操作完成:
以下是我如何使用RX解决这个问题:
这个例子特别简单,因为只有两个连续的操作要排序。即使在这个简单的例子中,我们也可以看到Rx增加了价值。如果没有它,我就不得不使用状态变量来确保事件按一定顺序触发。我还必须编写一些非常难看的代码来明确地从LayoutUpdated事件中分离出来。 当您使用RX编程时,诀窍是思考“我希望我的框架提供什么事件?”然后去创造它。我们被训练将事件看作简单的、由输入驱动的事物(“鼠标悬停”、“鼠标悬停”、“键控”等)。但是,没有理由事件不能非常复杂,并且特定于您的应用程序(“GoogleMsdnmashupstockDataReached”、“DragStarting”和“ImageContentChanged”)。当你以这种方式组织你的程序时(准确地创建我需要的事件 然后 通过改变状态来响应它)您会发现它们的状态错误更少,更有序,并且更自我描述。 知道了?-) |
![]() |
2
4
我不确定其优势,但我发现与经典.NET事件有以下不同: 错误通知
经典事件需要单独的事件,或者
通知结束通知
经典事件将需要一个单独的事件
|
![]() |
3
3
它只是对基于事件的编程模型的扩展。您创建了实现iobserver的东西,基本上您是在说“当集合中的某个东西发生变化时,我希望发生的事情就是这样”。那样的话,这只是我们所有人对事件所做的标准化。 他们把它推得像一张脸,而不是一个数不清的图案。IEnumerable是“pull”,而IObservable是“push”。 与直接事件相比,我看到的唯一优势是它是一个标准化的接口。不过,我发现这里的ObservableCollection(和inotifyCollectionChanged)有很大的重叠。也许他们正在尝试将Perl的座右铭与.NET结合起来:“有不止一种方法可以做到这一点”。 |
![]() |
4
2
你一定要看 Rx Workshop: Observables versus Events 视频和 完成附加的挑战 |
![]() |
Nicolas · c#/中多个Rx受试者的依赖注入。净核心 7 年前 |
![]() |
user584018 · 如何获取文件的增量内容 7 年前 |
![]() |
SuperJMN · 如何计算LINQ管道要完成的ETA? 7 年前 |
![]() |
Seishin Okigaru · RXSwift,检测到重入异常 7 年前 |
![]() |
marsop · 在typescript中观察集合 7 年前 |