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. マーブルダイアグラム
ソースの各要素が指定時間分だけ右にシフトされて発行されます。要素間の相対的な間隔は維持されます。
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 を参照してください。