对不起,不是要挑剔你,但是:
总是丢弃 IDISPOSABLES!!!!!!
(编辑:好的,不知道今天早上我在咖啡里放了什么,但我回答了一大堆废话;我会留下上面的只是因为总的来说,你确实想确保处理任何东西IDisposable
,但是为了弥补接下来的喋喋不休......)
该调用Subscribe
创建了一个您不会处理的订阅,因此对该方法的多次调用只会排队越来越多的垃圾 - 现在在这种特定情况下,它不是世界末日,因为Timer
唯一触发一次,但仍然...处置!
如果你真的想使用这种方法(我认为更好的方法是让一些正在运行的线程/任务“倾向于”你的值,当它认为有必要时删除它),至少尝试类似于:
好吧,忽略所有那些被淘汰的废话。的实现Observable.Timer
是这样的:
public static IObservable<long> Timer(TimeSpan dueTime)
{
return s_impl.Timer(dueTime);
}
这反过来又调用了这个:
public virtual IObservable<long> Timer(TimeSpan dueTime)
{
return Timer_(dueTime, SchedulerDefaults.TimeBasedOperations);
}
这叫...
private static IObservable<long> Timer_(TimeSpan dueTime, IScheduler scheduler)
{
return new Timer(dueTime, null, scheduler);
}
这就是事情变得有趣的地方 -Timer
是 a Producer<long>
,肉味的地方是:
private IDisposable InvokeStart(IScheduler self, object state)
{
this._pendingTickCount = 1;
SingleAssignmentDisposable disposable = new SingleAssignmentDisposable();
this._periodic = disposable;
disposable.Disposable = self.SchedulePeriodic<long>(1L, this._period, new Func<long, long>(this.Tock));
try
{
base._observer.OnNext(0L);
}
catch (Exception exception)
{
disposable.Dispose();
exception.Throw();
}
if (Interlocked.Decrement(ref this._pendingTickCount) > 0)
{
SingleAssignmentDisposable disposable2 = new SingleAssignmentDisposable {
Disposable = self.Schedule<long>(1L, new Action<long, Action<long>>(this.CatchUp))
};
return new CompositeDisposable(2) { disposable, disposable2 };
}
return disposable;
}
现在,base._observer.OnNext
,这是设置为在计时器滴答声上触发的内部接收器,其中Invoke
on 是:
private void Invoke()
{
base._observer.OnNext(0L);
base._observer.OnCompleted();
base.Dispose();
}
所以是的。它会自动处理自己 - 并且不会有任何“挥之不去的订阅”浮动。
嗯……乌鸦很好吃。:|