DelaySubscription
1. 概要
DelaySubscription は、ソースシーケンスへの購読自体を指定した時間だけ遅延させるオペレーターです。遅延期間中はソースに購読されないため、ソースの値は一切受け取りません。
リトライ時のバックオフや、複数のストリームの購読タイミングをずらしたい場合に使用します。
2. シグネチャ
TimeSpan による購読遅延
csharp
public static Observable<T> DelaySubscription<T>(
this Observable<T> source,
TimeSpan dueTime)dueTime 経過後にソースへの購読を開始します。
csharp
source.DelaySubscription(TimeSpan.FromSeconds(5))TimeSpan + TimeProvider による購読遅延
csharp
public static Observable<T> DelaySubscription<T>(
this Observable<T> source,
TimeSpan dueTime,
TimeProvider timeProvider)TimeProvider を指定してタイマーの実装を差し替えられます。
csharp
source.DelaySubscription(TimeSpan.FromSeconds(5), fakeTimeProvider)overload の使い分け
| overload | 使う場面 |
|---|---|
TimeSpan | 通常の購読遅延 |
TimeSpan, TimeProvider | ユニットテストで時間を制御したい場合 |
3. マーブルダイアグラム
購読が指定時間だけ遅延されます。遅延期間中にソースが発行した値は受け取られません。図ではグレーの値が購読開始前の通知で、遅延後に購読が開始されてからの値だけが下流に流れます。
4. サンプルコード
csharp
using R3;
// 5 秒後に購読を開始
source
.DelaySubscription(TimeSpan.FromSeconds(5))
.Subscribe(x => Console.WriteLine($"値: {x}"));
// リトライ時のバックオフ
source
.OnErrorRetry(
retryCount: 3,
onError: ex => Console.WriteLine($"エラー: {ex.Message}"))
.DelaySubscription(TimeSpan.FromSeconds(2))
.Subscribe(x => Process(x));
// FakeTimeProvider を使ったテスト
var fakeTime = new FakeTimeProvider();
var subscribed = false;
Observable.Defer(() =>
{
subscribed = true;
return Observable.Return(42);
})
.DelaySubscription(TimeSpan.FromSeconds(3), fakeTime)
.Subscribe(x => Console.WriteLine(x));
// subscribed: false — まだ購読されていない
fakeTime.Advance(TimeSpan.FromSeconds(3));
// subscribed: true — 購読開始、42 が出力される5. 補足
Delay との違い
| オペレーター | 遅延対象 | 購読タイミング | 遅延前の値 |
|---|---|---|---|
| Delay | 各要素の発行 | 即座に購読 | 受け取る(遅延して発行) |
| DelaySubscription | 購読自体 | 指定時間後に購読 | 受け取らない |
Delay はすぐにソースに購読し、受け取った値を遅延させて発行します。DelaySubscription は購読自体を遅延させるため、遅延期間中にソースが発行した値は完全に失われます。
フレームベースの版は DelaySubscriptionFrame を参照してください。