Observable.Timer
第二个方法是一个Observable.Timer,它有几个重载,首先我们要了解的是最基础的Observable.Timer重载,就像Observable.Interval那样只接受一个时间戳,Observable.Timer将会在所指定时间后发布一个为0的值后完成:
Output:
0
completed
进一步的重载是添加一个时间戳来制定生成后续值的时间,并允许我们通过Observable.Timer来构造Observable.Interval :
注意,现在IObservable返回的类型将是long而非int。Observable.Interval在生成第一个值之前会等待第一个参数所指定的时间。这个Observable.Timer的重载提供了选择启动队列的时间的能力,与Observable.Timer配合,你可以像下面这样写一个立即开始的队列:
最后,我们将介绍第三个,也是最常用的方法:Observable.Generate。这次我们介绍它的一个更复杂的重载,允许你提供一个指定将要产生的下一个值的时间过滤条件的方法:
使用该重载并指定timeSelector参数,我们可以实现自己的Observable.Timer和Observable.Interval。
使用Observable.Generate可以生成infinite sequence(无限队列)。
Transitioning into IObservable<T>
Observabl队列的生成包含了函数式编程中比较复杂的部分:corecursion和unfold,但你也可以简单地采取通过从一个同步或者异步的范式过渡到RX范式的方式。
From delegates
Observable.Start方法允许你将一个长期运行的Func<T>委托或Action委托(也就是短时间内无法完成的委托)转换为一个single value的observable。默认情况下,进程将会在一个线程池线程上异步完成。如果你使用的是Func<T>重载,返回类型将是IObservable<T>,其值被返回的同时将会被发布,然后队列就会完成;如果使用的是Action,那么返回类型则是 IObservable<Unit>。
Unit类型是一种函数式编程构造,和void类似。在这种情况下Unit用于确认和发布Action委托的完成,然而这是无关紧要的,因为无论如何队列都回在Unit之后立即完成。Unit类型本身没有value,它只是OnNext消息的一个空的载体。下面是使用两种重载的例子:
From events
正如我们早在书中所讨论的,.NET已经提供了一个事件驱动的编程模型。 虽然RX是一个更强大和有用的框架,但它是后来才开发出来的,并需要与现有的事件模型集成。RX提供了接受事件并将其转换为可观测物序列的方法。有几种不同的种类可供选择。以下是几种常见事件模式的选项:
这些重载令人混乱,但关键是找出它们的事件签名加以区别。如果签名是EventHandler可以用第一个例子,如果委托是EventHandler的子类,你可以使用第2个例子,如果委托是泛型的,那么使用第3个例子。
暂无关于此日志的评论。