Observable.Timer()会导致内存泄漏吗?

Sta*_*erc 4 .net timer system.reactive observable

最近我注意到我的代码中有一个使用Reactive Extensions的小错误.我订阅了Timer,但我从未处理过我的订阅.这导致内存泄漏.

我创建了一个突出显示这种危险的片段:

while (true)
{
    Observable.Timer(TimeSpan.Zero, TimeSpan.FromMinutes(1)).Subscribe(Console.WriteLine);
}
Run Code Online (Sandbox Code Playgroud)

这是正常的行为吗?

当订阅者与应用程序的其余部分失去连接时,调度程序是否应该保留对计时器的弱引用以使其收集垃圾?

Ric*_*lay 6

可以保留对订阅的引用,甚至可以将它们与a组合在一起CompositeDisposable,但通常使用管理IObservable生命周期的方法(例如Timer)是通过使用将终止规则应用于另一个的运算符,例如Take(取x值),TakeWhile(在f(x)返回true时取值)或TakeUntil(取值直到另一个序列,y,发出值或完成).

运行Rx运算符不会自动GC,除非它们已完成.Timer/ Interval,例如,两者都使用a递归调度其下一个值,IScheduler并且各种调度程序的默认实例都可以通过静态属性访问Scheduler.这使得运行的操作员始终具有根,因此不适用于GC.


Sco*_*ein 4

这是正常现象,也是一个特点

Subscribe() 的语义是永远监听,或者直到 Dispose() 或 OnCompleted() 或 OnError()(以先到者为准)。