2016-05-10 11 views
6

私はObservable.Interval(TimeSpan.FromSeconds(1))を持っています。しかし時には私はDBからのチェックを行うときに、すぐに別のチェックを実行したい(キューに何かがあることを知っているので、そのサブスクライバに再度呼び出す)。反応性 - 観測可能な間隔を手動トリガーと組み合わせる

Observable    
.Interval(TimeSpan.FromSeconds(1)) 
.Sample(TimeSpan.FromSeconds(1)) //to avoid multiple 'stacked' intervals 
.Subscribe(RepeatAction); 


private void RepeatAction(long _) 
{ 
    bool wasSuccess; 
    do 
    { 
     wasSuccess = CheckingInDB(); //Long operation 
    } while (wasSuccess); 
} 

をしかし、それは純粋反応性と行動のようなものを達成することが可能である:

は、私はすでに加入者メソッド内whileと間隔を組み合わせることにより、類似した何かを達成するために管理していますか?

+1

'SubscribeInContext'メソッドとは何ですか?それはどこから来たの? – Enigmativity

答えて

3

はい。可能です。

最初に、あなたがRxで持っている誤解があります。

あなたはこのコードを実行する場合:

void Main() 
{ 
    Observable 
     .Interval(TimeSpan.FromSeconds(1.0)) 
     .Sample(TimeSpan.FromSeconds(1.0)) 
     .Timestamp() 
     .Subscribe(RepeatAction); 
} 

private void RepeatAction(Timestamped<long> _) 
{ 
    Console.WriteLine(_.Timestamp); 
    Thread.Sleep(10000); 
} 

あなたはこの結果を得るでしょうが:

2016/05/11 10:37:57 +00:00 
2016/05/11 10:38:07 +00:00 
2016/05/11 10:38:17 +00:00 
2016/05/11 10:38:27 +00:00 

あなたが生産されている各値間のステップは、10秒、1でないことがわかります。 Interval演算子は、各値の間の隙間がの継続時間が少なくとものであることを単に保証しますが、観察者が時間がかかると、各加入者がかかる時間が長くなります。値をキューに入れません。

.Sample(TimeSpan.FromSeconds(1))は、.Interval(TimeSpan.FromSeconds(1.0))として何もしておらず、最小の値のギャップがすでに1秒であることを確認しています。

ここで、純粋なRx演算子を使用して問題を解決します。これは、データベースをチェックするために毎秒を尽くす

var query = 
    Observable 
     .Interval(TimeSpan.FromSeconds(1.0)) 
     .Select(_ => 
      Observable 
       .While(
        () => CheckingInDB(), 
        Observable.Return(Unit.Default))) 
     .Switch(); 

が、それは価値を打つ一度それがしなくなるまでそれがすぐにチェックを繰り返し:これを試してみてください。その後、1秒待ってから再試行します。

+0

あなたの答えをありがとう、それは論理的に聞こえるが、私はそれを動作させることはできません。それは決してCheckingInDb()を起動しません。何か案は? –

+0

@Knopo - 私は私の開発環境にそのままコピー&ペーストで自分のクエリをテストし、期待通りに 'CheckingInDB'を呼び出すことができました。非常に単純な 'CheckingInDB'を作成して何が起こるかを見てみましょう。私は 'public boolでしたCheckingInDB(){Console.WriteLine("! ");真を返します。 } '。 – Enigmativity

+1

@Knopo - あなたは観測可能なものを購読しましたか? – Enigmativity

関連する問題