2011-04-26 7 views
4

プロパティ値を繰り返し取得して別のプロパティに割り当てることはしたいのですが、RxのObservable作成はまだ処理されていません。どのようにしてプロパティを常時読み取っているオブザーバブルを作成したり購読したりするにはどうすればいいでしょうか(おそらくタイマーやスロットルで)?メソッドを繰り返し呼び出すobservableを作成します

+0

に使用できるが所有するオブジェクトをいプロパティは 'INotifyPropertyChanged'を万一実装しますか?それはこれを解決するよりきれいな方法でしょう。 –

+0

@リチャードいいえ、それはINPCを実装していません。私はそれについて考えましたが、この動作を得るために導入する価値はありません。 – Pat

+0

私は同意しませんが、十分に公正です! –

答えて

9

スタティックInterval演算子を使用して、指定された時間間隔で値を繰り返し送信し、次にSelectオペレータを使用して、ポーリングするオブジェクトのプロパティ値に変換できます。

var objectIWantToPoll = new MyObject(); 
var objectIWantToSetPropertyOn = new MyObject(); 


var polledValues = Observable.Interval(TimeSpan.FromSeconds(1)) 
    .Select(_ => objectIWantToPoll.SomeProperty); 

polledValues.Subscribe(propertyValue => 
    objectIWantToSetPropertyOn.SomeProperty = propertyValue)); 
+0

ああ、それはあなたが 'Interval'メソッドを使う方法です。 – Pat

+2

不要な通知を避けるためにDistinctUntilChangedを追加したいかもしれません – Christoph

0

いくつかのコンポーネントが変更された値をポーリングするポーリング実装を基本的に求めているようです。オブザーバブルは通常、値を取得するのではなく、(イベント/オブザーバブル/などを介して)プッシュされたオブジェクトに反応するためのものです。おそらく、タイマーのバックグラウンドプロセスを設定し、そのタイマーのTickで操作するだけで十分です。 Observable.IntervalはJames Hayが言及したのと同様に動作します。 Observable.Intervalはディスパッチャスレッドから実行コンテキストを移動することに注意してください。

なぜRxをポーリングの実装に入れようとしていますか?ここで同期しようとしている他の観測可能なデータソースがありますか?

+1

rxは 'プル'ではなく 'プッシュ'であると理解していますが、タイマーよりもポーリングに使用する方が簡単です。おそらく、私はそれを別の方法で見なければならないかもしれません - 私は2次オブジェクトから特定のプロパティではなくObservableを返すことができます。 – Pat

1
public static IObservable<long> CreateObservableTimerWithAction(this Action actionT, int timeSpan, Control control) 
    { 
     var obs = Observable.Create<long>(
      observer => 
      { 
       Observable.Interval(TimeSpan.FromMilliseconds(timeSpan)) 
.DistinctUntilChanged(fg =>control.Text).Subscribe(l => actionT()); 
       return Disposable.Empty; 
      }); 

     return obs; 
    } 

0R:

public static IObservable<long> CreateObservableTimer<T>(this Action actionT,int timeSpan) 
    { 
     var obs= Observable.Create<long>(
      observer => 
      { 
       Observable.Interval(TimeSpan.FromMilliseconds(timeSpan)) 
.DistinctUntilChanged().Subscribe(l => actionT()); 
       return Disposable.Empty; 
      }); 
     return obs; 
    } 

私は(obs.Dispose())に処分されるまで時間指定の方法は、特定の時間に行く持って、かなり頻繁にこれを使用..

CreateObservableTimer(()=> CheckForDequeues(1)、500);

私は実際に時々長いを使用しますが、時間のほとんどは、ない...

がさえプライオリティキューにスケジューラをチェックするために、このヘルパーを使うので、

関連する問題