2010-08-10 28 views
6

Bir INotifyPropertyChanged nesnesine Foo'yum. Ben Rx en FromEvent yöntemini kullanarak olayların gözlemlenebilir akışı içine Foo çevirmek:Rx - etkinlikten çıkmak için

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

Şimdi belirli bir özellik değişti dinlemek istiyor ve .adresine yapabilirsiniz == 100 ise, abonelikten:

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

nasıl İlerleme == 100 iken aboneliği iptal edebilir miyim? .Where maddesinden sonra bir .Take (1) çağrısı eklerseniz, bu otomatik olarak aboneliği iptal eder mi?

+0

:.. bir sökünüz (1) sorguya otomatik atarken çağırır OnCompleted, arayacak ekleyerek –

cevap

11

Bir seçenek Subscribe döndürülen değerini kullanmaktır:

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

... 

// Unsubscribe 
subscription.Dispose(); 

Ben şüpheliTake(1) kullanarak aslında olsa abonelikten edeceğini ve bu sizin için kıvrımlara olabilir. Buna biraz baktığımda, bu otomatik olarak aboneliği iptal eden "tamamlandı" mesajını vereceğinden, bu 'un aboneliğinden çıkacağından eminim. Ben

+0

elimden fark Dispose, maalesef ihtiyacım var çağrı IDF'ye gönderilmeyen OnFooFinished işleyicinin içine atın. Ancak, Take (1) hile yaparsa, bu kesinlikle harika olur. Bu konuda yüce Skeet'e güveneceğim. Başarısız olursa, Skeet'in takımım olduğunu söylerim. :-) –

+0

@ Jadah: LOL. Eminim ki, OnFooFinished, en azından tekrar çağrılmayacak. Gerçek üyelikten çıkmanın önemli olduğunu varsayarsak, bunun kontrol edilmesine değer. Birkaç saat içinde bakabilirim, eğer bu bir yardımsa. –

+0

Ah, işi benim için yapmak zorunda değilsin. Kontrol edeceğim. Yine de teşekkürler. Ne bulduğumu size bildiririm. –

14

Sen TakeWhile yöntemi kullanabilirsiniz :(korkuyorum şu anda kesin bu kontrol etmek için zaman yok:

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

TakeWhile yatan gözlemlenebilir dizisi imha edecek onun yüklem Eğer elle imha aramak zorunda değil olacak, false döndürür aşağıda Jon'un cevabını kabul ettik

+0

Teşekkürler arasındaki aynı olduğundan emin olmak için bir sarıcı kullanır. MyFoo.Progress == 100 iken bazı işlevleri çağırmam gerekiyor, bu yüzden bu benim senaryo için pek işe yaramıyor. Ama teşekkürler, şimdi fikri anlıyorum. –

+0

@Judah - Markus'un cevabı bunu yapmanıza izin verecek; Abonenin OnCompleted kısmından yönteminizi arayın. –