Interval
1. 概要
Interval は、一定の時間間隔で Unit を繰り返し発行するファクトリメソッドです。Timer とは異なり、初回遅延を個別に指定することはできず、最初の発行も period 経過後に行われます。
自動的には完了しないため、CancellationToken やオペレーター(Take など)で購読を終了させる必要があります。
2. シグネチャ
基本
csharp
public static Observable<Unit> Interval(TimeSpan period, CancellationToken cancellationToken = default)period 間隔で Unit を繰り返し発行します。初回の発行は period 経過後です。
csharp
Observable.Interval(TimeSpan.FromSeconds(1))TimeProvider 指定
csharp
public static Observable<Unit> Interval(TimeSpan period, TimeProvider timeProvider, CancellationToken cancellationToken = default)使用する TimeProvider を明示的に指定するオーバーロードです。
csharp
Observable.Interval(TimeSpan.FromMilliseconds(500), TimeProvider.System)オーバーロードの使い分け
| overload | 使う場面 |
|---|---|
Interval(TimeSpan) | 一定間隔で繰り返し発行する(最も一般的) |
Interval(TimeSpan, TimeProvider) | テスト容易性の確保、カスタムスケジューラの利用 |
3. マーブルダイアグラム
period が経過するたびに Unit を発行します。初回の発行は購読時点から period 後であり、以降も同じ間隔で発行し続けます。自動的には完了しません。
4. サンプルコード
csharp
using R3;
// 1 秒ごとに繰り返し発行
var cts = new CancellationTokenSource();
Observable.Interval(TimeSpan.FromSeconds(1), cts.Token)
.Subscribe(_ => Console.WriteLine($"tick: {DateTime.Now:HH:mm:ss}"));
// 出力例:
// tick: 12:00:01
// tick: 12:00:02
// tick: 12:00:03
// ...(cts.Cancel() で停止)
// Take と組み合わせて 5 回で自動完了
Observable.Interval(TimeSpan.FromMilliseconds(500))
.Take(5)
.Subscribe(
_ => Console.WriteLine("tick"),
_ => Console.WriteLine("完了"));
// 出力:
// tick(×5 回)
// 完了
// TimeProvider を指定(テスト向け)
var fakeTime = new FakeTimeProvider();
Observable.Interval(TimeSpan.FromSeconds(2), fakeTime)
.Subscribe(_ => Console.WriteLine("tick"));
fakeTime.Advance(TimeSpan.FromSeconds(6));
// 出力: tick, tick, tick5. 補足
Timer との違い
Timer に period を指定すると繰り返し発行が可能ですが、初回遅延(dueTime)と周期(period)を個別に設定できます。Interval(period) は Timer(period, period) と等価です。初回遅延を短くしたい、または長くしたい場合は Timer を使用してください。
IntervalFrame との違い
実時間ではなくフレーム数で間隔を指定したい場合は IntervalFrame を使用してください。