Skip to content

SkipUntil

1. 概要

SkipUntil は、外部のシグナル(別の Observable、CancellationToken、Task)や非同期関数が発火するまでソースシーケンスの要素をスキップし、シグナル発火後の要素を通過させるオペレーターです。

2. シグネチャ

別の Observable がトリガー

csharp
public static Observable<T> SkipUntil<T, TOther>(
    this Observable<T> source,
    Observable<TOther> other)

other が最初の要素を発行した時点以降のソース要素を通過させます。それまでの要素はスキップされます。

csharp
// startSignal が発行されるまでスキップ
source.SkipUntil(startSignal);

CancellationToken がトリガー

csharp
public static Observable<T> SkipUntil<T>(
    this Observable<T> source,
    CancellationToken cancellationToken)

cancellationToken がキャンセルされた時点以降の要素を通過させます。

csharp
// キャンセルトークンのキャンセルをトリガーにする
source.SkipUntil(cts.Token);

Task がトリガー

csharp
public static Observable<T> SkipUntil<T>(
    this Observable<T> source,
    Task task,
    Boolean configureAwait = true)

task が完了した時点以降の要素を通過させます。

csharp
// 初期化タスクの完了を待ってから要素を受け取る
source.SkipUntil(initializeTask);

非同期関数がトリガー

csharp
public static Observable<T> SkipUntil<T>(
    this Observable<T> source,
    Func<T, CancellationToken, ValueTask> asyncFunc,
    Boolean configureAwait = true)

各要素に対して非同期関数を実行し、関数が完了した時点以降の要素を通過させます。

csharp
// 非同期処理の完了をトリガーにする
source.SkipUntil(async (x, ct) => await WaitForReadyAsync(x, ct));

overload の使い分け

overload使う場面
Observable<TOther>別のイベントストリームをトリガーにしたい場合
CancellationTokenキャンセルトークンでライフサイクルを管理している場合
Task非同期タスクの完了をトリガーにしたい場合
Func<T, CancellationToken, ValueTask>要素ごとの非同期処理完了をトリガーにしたい場合

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

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

トリガーシーケンスが最初の要素を発行するまで、ソースの要素はすべてスキップされます。トリガー発火後はソースの要素がそのまま下流に流れます。

4. サンプルコード

csharp
using R3;

// 別の Observable をトリガーにする
var source = Observable.Interval(TimeSpan.FromMilliseconds(200));
var starter = Observable.Timer(TimeSpan.FromSeconds(1));

source
    .SkipUntil(starter)
    .Take(5)
    .Subscribe(x => Console.WriteLine($"値: {x}"));

// Task をトリガーにする(初期化完了後に処理開始)
var initTask = InitializeAsync();

eventSource
    .SkipUntil(initTask)
    .Subscribe(e => ProcessEvent(e));

// CancellationToken をトリガーにする
var cts = new CancellationTokenSource();
// 外部から cts.Cancel() が呼ばれるまでスキップ

source
    .SkipUntil(cts.Token)
    .Subscribe(x => Console.WriteLine($"値: {x}"));

5. 補足

TakeUntil との関係

TakeUntilSkipUntil は対称的な関係にあります。

オペレーターシグナル前シグナル後
TakeUntil通過させる完了
SkipUntilスキップする通過させる

SkipWhile との違い

  • SkipUntil: 外部シグナル(Observable、CancellationToken、Task など)をトリガーにします。
  • SkipWhile: 要素の値に基づく条件でスキップの終了を判定します。

用途に応じて使い分けてください。外部イベントに依存する場合は SkipUntil、要素の値に依存する場合は SkipWhile が適切です。