你如何停止Observable.Timer()?

Joh*_*lds 6 .net f# system.reactive

如果使用Observable创建Observable.Timer(),你如何阻止它?

let tmr = Observable.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds 1000.)
let subscription = tmr.Subscribe(myFunction)
// ...
subscription.Dispose()
Run Code Online (Sandbox Code Playgroud)

你是否甚至需要阻止它,或者当它的所有用户都被处理掉后它会被垃圾收集?

Fyo*_*kin 9

在您订阅它之前,计时器甚至不会开始"触发"(您称之为" 冷可观察 ").而且:它会像订阅它一样多次开始射击.试试这个:

    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")
Run Code Online (Sandbox Code Playgroud)

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

因此,一旦订阅被处理,计时器就会停止"触发".但只有那个特定的计时器,而不是所有的计时器.

考虑tmr对象的一种方法是作为"计时器工厂",而不是"计时器".

  • @JohnReynolds:是的,当然会收集垃圾; 就像任何其他对象一样. (3认同)
  • 我相信这些文档现在越来越受到关注,很快就可能会得到社区的贡献. (3认同)
  • @TomaszMaczyński:当文档无益时,我通常会使用实验(如上所述)或[源代码](https://github.com/Reactive-Extensions/Rx.NET/blob/1ad21f5a853f2b7be5f3a7e4a8d276e7d28f0d73/Rx.NET/Source/ System.Reactive.Linq/Reactive/Linq/QueryLanguage.Time.cs#L1517)(当源不可用时为ILSpy). (2认同)
  • @TomaszMaczyński这是在IntroToRx.com上"记录"的.Seehttp://introtorx.com/Content/v1.0.10621.0/04_CreatingObservableSequences.html#ObservableTimer和http://introtorx.com/Content/v1.0.10621.0/14_HotAndColdObservables.html#HotObservables.C#中的示例. (2认同)