2016-08-21 45 views
5

如果Observable是使用Observable.Timer()创建的,那么您如何阻止它?如何停止Observable.Timer()?

let tmr = Observable.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds 1000.) 
let subscription = tmr.Subscribe(myFunction) 
// ... 
subscription.Dispose() 

您是否甚至需要停止它,或者当它的所有订阅者都被丢弃时它会被垃圾收集?

回答

8

定时器甚至不会开始“开火”,直到您订阅它(您会称之为“cold observable”)。此外:它会开始发射尽可能多的订阅它。试试这个:

let tmr = Observable.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds 1000.) 
    let subscription = tmr.Subscribe(printfn "A: %d") 
    Thread.Sleep 500 
    let subscription2 = tmr.Subscribe(printfn "B: %d") 

该程序将打印出A: 1,然后B: 1,然后A: 2,然后B: 2,等等 - 每500毫秒约。

因此,定时器一旦处理订阅就会停止“触发”。但只有那个特定的计时器,不是全部。

想一想你的tmr对象的一种方法是作为“定时器工厂”,而不是“定时器”。

+0

如果所有订阅都处理完毕,并且“计时器工厂”本身没有固定到某个值,它会被垃圾收集吗? –

+0

感谢您的解释。有没有像这样的信息的任何参考来源?我在[Observable.Timer的文档](https://msdn.microsoft.com/en-us/library/system.reactive.linq.observable.timer(v = vs.103).aspx)中看不到信息,无论它是否创建一个热的或冷的可观察的。 –

+3

@JohnReynolds:是的,它当然会被垃圾收集起来;就像任何其他物体一样。 –