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. マーブルダイアグラム
シーケンスの要素をすべて無視し、完了シグナルを受信した時点で 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("タイムアウトによりキャンセルされました");
}