2012-06-15 18 views
7

Bazı kısaltma davranışlarını benim görünümlerimden birine uygulamak için arıyorum. Bu bir gümüş ışığı uygulaması, ancak bunun özellikle önemli olduğunu düşünmüyorum.Olay azaltma/sıraya alma - Reaktif Uzantılar?

  • özellik1
  • özellik2
  • özellik3
  • bu özelliklerden biri güncellenir zaman

, bir yenileme gerekli olan:

üç özelliğe sahip bir sınıf düşünün. Bir Yenile sürüyor

  • , biz ideal olarak sunucuya çağrıyı iptal olmalı ve bir özellik değiştirilirse
  • yeni isteği, şu şekildedir:

    private void Refresh() 
    { 
        //Call out to the server, do something when it comes back 
    } 
    

    Benim hedefleri ek değişiklikler için beklediğimiz zamanın küçük bir penceresini (belki de 0.1 saniye) bırakmalıyız. Bu şekilde, birden fazla özellik hızlı bir şekilde değiştirilirse (örneğin, programlı olarak), sunucuyu isteklerle birlikte spam etmeyiz. Her değişiklikte sıfırlamak için 0.1 saniyelik bir pencere için tamam, ancak gerekli değildir.

Önemli ise, sunucu araması için bir ChannelFactory uygulaması kullanıyorum.

Bunu yapmak için ne tür desenler kullanabilirim? Bu, reaktif uzantıların bana yardımcı olabileceği bir şey mi?

Düzenleme:

doğru olarak Paul cevabı işaretleniyor. ReactiveUI şu anda silverlight5'e karşı çalışmıyor olsa da, Rx kullanarak problemi çözmek için yaklaşım/kompozisyon adımlarını açıkça belirtiyor. İşte

+1

Rx kesinlikle bu destekler, http://rxwiki.wikidot.com/101samples#toc29 bkz - Görevler –

cevap

6

Eğer ReactiveUI ile bunu gibi olacaktır:

IObservable<TheData> FetchNewData() 
{ 
    // TODO: Implement me 
} 

this.WhenAny(x => x.Property1, x => x.Property2, x => x.Property3, (x,y,z) => Unit.Default) 
    .Throttle(TimeSpan.FromMilliseconds(200), RxApp.DeferredScheduler) 
    .Select(x => FetchNewData()) 
    .Switch() // We only care about the req corresp. to latest values of Prop1-3 
    .ToProperty(this, x => x.Data); 

Güncelleme: Burada dışı sipariş alabilirsiniz uyarı ile, yalnızca bir bir anda çalışan olduğunu garanti etmek nasıl Sonuçlar. özellikleri değişen tutarsan, eski isteklerin kuyrukta ile bitireceğiz beri

this.WhenAny(x => x.Property1, x => x.Property2, x => x.Property3, (x,y,z) => Unit.Default) 
    .Throttle(TimeSpan.FromMilliseconds(200), RxApp.DeferredScheduler) 
    .Select(_ => Observable.Defer(() => FetchNewData())) 
    .Merge(1) 
    .ToProperty(this, x => x.Data); 

açıkladığınız davranış, aslında sorunu, belki katlanmak değildir olurdu - Bir gibi bir şey yaptıysam bunu optimize olabilir "BufferingSwitch()" operatörü, sonuçlarının hiçbir değişiklik olmadığından emin olmadan sonuç döndürmedi - aslında yazacak kadar havalı. Hikayenin

Ahlaki, zaman uyumsuz Karışık mı ™ :)

+0

den CancellationToken bakmak - bu iptal etme hakkında Teşekkürler, ilk bakışta ihtiyacım olana benziyor. Silverlight için geçerli mi? Bunu denemek için WhenAny uzantısı yöntemini bulamıyorum. –

+0

@ShaunRowan: Bu uzantı, ReactiveUI'den (http://www.reactiveui.net). Önceki sürümler (v2) Silverlight'ı destekler. Geçerli sürüm (v3) yok. Özellikle MVVM yapıyorsanız, bu gerçekten harika bir kütüphanedir. –

+0

Teşekkürler, ben kontrol edeceğim! Bir sebepten dolayı beynim "reaktif uzantıları" ile "ReactiveUI" yi değiştirdi. (Kütüphanenin farkında değildim.) –