Skip to content

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

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

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, tick

5. 補足

Timer との違い

Timerperiod を指定すると繰り返し発行が可能ですが、初回遅延(dueTime)と周期(period)を個別に設定できます。Interval(period)Timer(period, period) と等価です。初回遅延を短くしたい、または長くしたい場合は Timer を使用してください。

IntervalFrame との違い

実時間ではなくフレーム数で間隔を指定したい場合は IntervalFrame を使用してください。