Skip to content

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. マーブルダイアグラム

DelaySubscription のマーブルダイアグラム

購読が指定時間だけ遅延されます。遅延期間中にソースが発行した値は受け取られません。図ではグレーの値が購読開始前の通知で、遅延後に購読が開始されてからの値だけが下流に流れます。

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 を参照してください。