リストを終了するには、TakeWhile を使用します。
CancellationToken MyToken = ...
var list = await Foo().TakeWhile(v=>!MyToken.IsCancellationRequested).ToList();
次のアイテムが提供されたときにのみサブスクリプションがキャンセルされることが心配な場合は、この拡張メソッドを使用できます。
public static IObservable<T>
TakeWhile<T>
( this IObservable<T> This
, CancellationToken t
)
{
var cts = CancellationTokenSource.CreateLinkedTokenSource(t);
return Observable.Create<T>(( IObserver<T> observer ) =>
{
This.Subscribe(observer, cts.Token);
return Disposable.Create(() => cts.Cancel());
});
}
そして書く
CancellationToken MyToken = ...
var list = await Foo().TakeWhile(MyToken.IsCancellationRequested).ToList();
キャンセル トークンで TakeWhile を使用すると、最後の要素を返すだけの ToTask よりも構成しやすくなります。