使用 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 更具可组合性。