2016-10-12 5 views
4

Observable.Intervalは毎回値を生成します。アクションが次の繰り返しの前に終了するまで待つ方法Observable.Intervalはアクションが完了するまで待機します。

例:

Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(async t => 
{ 
    //Here could be some long running action with different duration each iteration 
    Console.WriteLine(t.ToString()); 
    await Task.Delay(3000); 
}); 

それは、アクションを毎秒を開始します。アクションが完了するまで待つ方法

答えて

-1

自分で実装してみませんか? whileループまたは再帰的な方法でTaskFactory.StartNewを使用してください。あなたはasync/awaitを導入しない限り - - は次に何を求めていることは、デフォルトの動作ですTask.Delay

+0

実際には、whileループや再帰的メソッドを使用しないでください。 –

+0

似たようなことができます。しかし、タイムスパンを通過することなく、行動を求めているものを実装することができます。あなたがしていることは、その行動を得て、それをタスクにし、そのタスクが完了するとアクションを再び呼び出すことです。 この投稿を確認:http://stackoverflow.com/questions/13695499/proper-way-to-implement-a-never-ending-task-timers-vs-task –

2

を使用して作業をシミュレートするので、asyncを削除し、代わりにTask.Delay(3000).Wait()を使用しています。

Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(t => 
{ 
    //Here could be some long running action with different duration each iteration 
    Console.WriteLine(t.ToString()); 
    Task.Delay(3000).Wait(); 
}); 

オブザーバーが終わったら、観測のための契約は、新しい値を生成します - あなたはasyncを紹介していない限り。

Observable.Interval(TimeSpan.FromSeconds(1))は、すべての第2の値を生成しない - それは、間隔第1の観察者(単数または複数)、仕上げと次の起動を生じさせます。

だから、あなたが長時間走っているオブザーバーを持っていれば、1回のフィニッシングと次のスタートの間に完全な秒があります。

+0

申し訳ありませんが、期待通りに機能しません。 'コード " Observable.Interval(TimeSpan.FromSeconds(1))。Subscribe(t => { //ここでは、繰り返しごとに異なる持続時間を持つ長時間実行されるアクションがあります。 Console.WriteLine(" Before "+ DateTime.Now。 ToLongTimeString()。ToString()); Task.Delay(3000).Wait(); Console.WriteLine( "After" + DateTime.Now.ToLongTimeString()。ToString()); }); 'code' 最後の「後」と次の「前に」は1秒間隔になります。 –

+0

申し訳ありませんが、期待されたコードとして動作しません。 'Observable.Interval(TimeSpan.FromSeconds(1))。Subscribe(t => { )Console.WriteLine(" Before "+ DateTime.Now.ToLongTimeString()。ToString ()); Task.Delay(3000).Wait(); Console.WriteLine( "After" + DateTime.Now.ToLongTimeString()。ToString()); 最後の "After" with次の "前"には1秒間隔がありません。 –

関連する問題