【问题标题】:How do you stop an Observable.Timer()?你如何停止 Observable.Timer()?
【发布时间】:2016-08-21 21:06:25
【问题描述】:

如果一个 Observable 是使用Observable.Timer() 创建的,你如何停止它?

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

你甚至需要停止它,还是在它的所有订阅者都被释放后被垃圾回收?

【问题讨论】:

    标签: .net f# system.reactive


    【解决方案1】:

    在您订阅之前,计时器甚至不会开始“触发”(您会称之为“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 对象的一种方法是将其视为“计时器工厂”,而不是“计时器”。

    【讨论】:

    • @JohnReynolds:是的,当然会被垃圾回收;就像任何其他对象一样。
    • @TomaszMaczyński:当文档没有帮助时,我通常使用实验(如上)或source code(或 ILSpy,当源不可用时)。
    • @FyodorSoikin 谢谢。我希望有一些规则(例如,除非另有说明,否则 observables 是冷的)。
    • @TomaszMaczyński 这在 IntroToRx.com 上有“记录”。参见http://introtorx.com/Content/v1.0.10621.0/04_CreatingObservableSequences.html#ObservableTimer 和introtorx.com/Content/v1.0.10621.0/…。 C# 中的示例。
    • 我相信这些文档现在得到了更多的关注,并且可能很快就会得到社区的贡献。
    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2011-06-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多