7

INotifyPropertyChanged オブジェクト Foo があります。Rx の FromEvent メソッドを使用して、Foo を監視可能なイベント ストリームに変換します。

var myFoo = new Foo();
var eventStream = Observable.FromEvent<PropertyChangedEventArgs>(myFoo, "PropertyChanged");

ここで、特定のプロパティの変更をリッスンし、.Progress == 100 の場合は購読を解除したいと考えています。

eventStream
   .Where(e => myFoo.Progress == 100)
   .Subscribe(OnFooFinished);

Progress == 100 の場合、どのように登録を解除できますか? .Where 句の後に .Take(1) 呼び出しを追加すると、自動的に登録解除されますか?

4

2 に答える 2

20

TakeWhile メソッドを使用できます。

eventStream.TakeWhile(e => myFoo.Progress != 100);

TakeWhile、述語が false を返すと、基礎となるオブザーバブル シーケンスを破棄します。dispose を手動で呼び出す必要はありません。

于 2010-08-10T14:51:54.960 に答える
19

1つのオプションは、次の戻り値を使用することですSubscribe

IDisposable subscription = eventStream.Where(e => myFoo.Progress == 100)
                                      .Subscribe(OnFooFinished);

...

// Unsubscribe
subscription.Dispose();

私は、使用することは確かに購読を解除するだろうと思う、そしてそれはあなたにとってより良いかもしれない。少し見てみると、「完了」メッセージが表示され、通常は自動的に購読が解除されるため、これで購読が解除されると確信しています。現時点ではこれを確認する時間がありません。恐れ入ります:(Take(1)

于 2010-08-10T14:10:27.770 に答える