4

IObservable<long>メソッドから呼び出した を返すasyncメソッドがあります。これを通常の に変換したいのですが、信号が送信List<long>された場合はその操作をキャンセルしますCancellationToken

私はこのようなことをしたいと思います:

List<long> result = await Foo().ToList(myCancellationToken);

これを達成するための正しい(そして最も簡単な)方法は何ですか?のToList()拡張メソッドは をIObservable<T>返し、パラメータIObservable<List<T>>を取りません。CancellationToken

4

2 に答える 2

4

リストを終了するには、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 よりも構成しやすくなります。

于 2013-08-21T11:34:41.267 に答える