申し訳ありませんが、あなたを選ぶつもりはありませんが、:
常にIDISPOSABLESを処分してください!!!!!
(編集:わかりました、今朝コーヒーに何を入れたかはわかりませんが、私はナンセンスの全体の混乱で答えました;一般的に、あなたは必ず処分したいので、上記を残しますIDisposable
が、次のせせらぎを補うために...)
を呼び出すとSubscribe
、破棄しないサブスクリプションが作成されるため、このメソッドを複数回呼び出すと、ますます多くのがらくたがキューに入れられます。この特定のケースでは、Timer
1回だけ起動するため、世界の終わりではありませんが、それでも...廃棄!
この方法を本当に使用したい場合(より良いアプローチは、値に「傾向がある」実行中のスレッド/タスクを用意し、必要と思われるときに削除することです)、少なくとも次のようなものを試してください。
わかりました、すべての打ちのめされたがらくたを無視します。の実装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
は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
は次のとおりです。
private void Invoke()
{
base._observer.OnNext(0L);
base._observer.OnCompleted();
base.Dispose();
}
あ、はい。それはそれ自体を自動処理します-そして「長引くサブスクリプション」が浮かんでいることはありません。
うーん……カラスが美味しいです。:|