Skip to content

Delay

1. 概要

Delay は、ソースシーケンスの各要素の発行を指定した時間だけ遅延させるオペレーターです。要素の順序は維持され、すべての要素が同じ時間だけ遅延します。

アニメーションのタイミング調整や、UI 上の表示タイミングをずらしたい場合などに使用します。

2. シグネチャ

TimeSpan による遅延

csharp
public static Observable<T> Delay<T>(
    this Observable<T> source,
    TimeSpan dueTime)

各要素を dueTime だけ遅延させて発行します。

csharp
source.Delay(TimeSpan.FromSeconds(1))

TimeSpan + TimeProvider による遅延

csharp
public static Observable<T> Delay<T>(
    this Observable<T> source,
    TimeSpan dueTime,
    TimeProvider timeProvider)

TimeProvider を指定してタイマーの実装を差し替えられます。テスト時に FakeTimeProvider を使用して時間を手動制御できます。

csharp
source.Delay(TimeSpan.FromSeconds(1), fakeTimeProvider)

overload の使い分け

overload使う場面
TimeSpan通常の遅延処理
TimeSpan, TimeProviderユニットテストで時間を制御したい場合

3. マーブルダイアグラム

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

ソースの各要素が指定時間分だけ右にシフトされて発行されます。要素間の相対的な間隔は維持されます。

4. サンプルコード

csharp
using R3;

// 通知を 2 秒遅延させて表示
notificationObservable
    .Delay(TimeSpan.FromSeconds(2))
    .Subscribe(msg => ShowNotification(msg));

// 複数のストリームのタイミングをずらす
var stream1 = source;
var stream2 = source.Delay(TimeSpan.FromMilliseconds(500));
var stream3 = source.Delay(TimeSpan.FromSeconds(1));

// FakeTimeProvider を使ったテスト
var fakeTime = new FakeTimeProvider();
var results = new List<int>();

Observable.Return(42)
    .Delay(TimeSpan.FromSeconds(3), fakeTime)
    .Subscribe(x => results.Add(x));

// results: [] — まだ遅延中
fakeTime.Advance(TimeSpan.FromSeconds(3));
// results: [42] — 遅延後に発行

5. 補足

DelaySubscription との違い

オペレーター遅延対象購読タイミング
Delay各要素の発行即座に購読
DelaySubscription購読自体指定時間後に購読

Delay はソースに即座に購読しますが、受け取った要素を一定時間バッファリングしてから下流に流します。一方 DelaySubscription は購読自体を遅延させるため、遅延期間中はソースの値を一切受け取りません。

フレームベースの版は DelayFrame を参照してください。