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. マーブルダイアグラム
トリガーシーケンスが最初の要素を発行するまで、ソースの要素はすべてスキップされます。トリガー発火後はソースの要素がそのまま下流に流れます。
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 との関係
TakeUntil と SkipUntil は対称的な関係にあります。
| オペレーター | シグナル前 | シグナル後 |
|---|---|---|
| TakeUntil | 通過させる | 完了 |
SkipUntil | スキップする | 通過させる |
SkipWhile との違い
SkipUntil: 外部シグナル(Observable、CancellationToken、Task など)をトリガーにします。- SkipWhile: 要素の値に基づく条件でスキップの終了を判定します。
用途に応じて使い分けてください。外部イベントに依存する場合は SkipUntil、要素の値に依存する場合は SkipWhile が適切です。