Skip to content

WaitAsync

1. 概要

WaitAsync は、Observable シーケンスの完了を Task として待機するオペレーターです。要素の値は収集せず、シーケンスが完了(OnCompleted)するまで待機します。副作用のみを目的としたシーケンスで、処理の完了タイミングだけを知りたい場合に使用します。OnErrorResume が通知された場合、または OnCompleted(Result.Failure) で失敗完了した場合は、その例外が Task を通じてスローされます。

2. シグネチャ

シーケンス完了の待機

csharp
public static Task WaitAsync<T>(
    this Observable<T> source,
    CancellationToken cancellationToken = default)

シーケンスが完了するまで待機します。発行される要素の値は無視されます。戻り値は Task(値なし)です。

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

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

シーケンスの要素をすべて無視し、完了シグナルを受信した時点で Task が完了します。

4. サンプルコード

csharp
// 基本的な使い方:副作用シーケンスの完了を待機
var source = Observable.Create<Unit>(observer =>
{
    Console.WriteLine("処理1を実行中...");
    observer.OnNext(Unit.Default);
    Console.WriteLine("処理2を実行中...");
    observer.OnNext(Unit.Default);
    Console.WriteLine("すべての処理が完了");
    observer.OnCompleted();
    return Disposable.Empty;
});

await source.WaitAsync();
Console.WriteLine("シーケンスが完了しました");
csharp
// Do オペレーターと組み合わせて副作用を実行
await Observable.Range(1, 5)
    .Do(x => Console.WriteLine($"処理中: {x}"))
    .WaitAsync();

Console.WriteLine("全件処理完了");
// 処理中: 1
// 処理中: 2
// 処理中: 3
// 処理中: 4
// 処理中: 5
// 全件処理完了
csharp
// CancellationToken を使ったキャンセル
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));

try
{
    await Observable.Timer(TimeSpan.FromSeconds(10))
        .WaitAsync(cts.Token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("タイムアウトによりキャンセルされました");
}