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)
这是正常的行为吗?
当订阅者与应用程序的其余部分失去连接时,调度程序是否应该保留对计时器的弱引用以使其收集垃圾?
您可以保留对订阅的引用,甚至可以将它们与a组合在一起CompositeDisposable
,但通常使用管理IObservable
生命周期的方法(例如Timer
)是通过使用将终止规则应用于另一个的运算符,例如Take
(取x值),TakeWhile
(在f(x)
返回true时取值)或TakeUntil
(取值直到另一个序列,y,发出值或完成).
运行Rx运算符不会自动GC,除非它们已完成.Timer
/ Interval
,例如,两者都使用a递归调度其下一个值,IScheduler
并且各种调度程序的默认实例都可以通过静态属性访问Scheduler
.这使得运行的操作员始终具有根,因此不适用于GC.
归档时间: |
|
查看次数: |
1742 次 |
最近记录: |