過去記事インデックス
- Reactive Extensions再入門 その1
- Reactive Extensions再入門 その2「IObservableインターフェースとIObserverインターフェース」
- Reactive Extensions再入門 その3「IObservableのファクトリメソッド」
- Reactive Extensions再入門 その4「Timer系のファクトリメソッド」
- Reactive Extensions再入門 その5「HotとCold」
- Reactive Extensions再入門 その6「HotなIObservableを作成するファクトリ」
- Reactive Extensions再入門 その7「LINQスタイルの拡張メソッド」
- Reactive Extensions再入門 その8「SkipとTakeメソッド」
- Reactive Extensions再入門 その9「Skip + Take + Repeat = ドラッグ」
- Reactive Extensions再入門 その10「Doメソッド」
- Reactive Extensions再入門 その11「Catchメソッド」
- Reactive Extensions再入門 その12「Finallyメソッドとリソース解放」
- Reactive Extensions再入門 その13「最後の値を取得するLatestとMostRecentメソッド」
- Reactive Extensions再入門 その14「Nextメソッド」
- Reactive Extensions再入門 その15「To*****系メソッド」
- Reactive Extensions再入門 その16「最大、最少、平均を求めるメソッド」
- Reactive Extensions再入門 その17「集計するメソッド」
- Reactive Extensions再入門 その18「CountメソッドとLongCountメソッド」
- Reactive Extensions再入門 その19「AnyメソッドとAllメソッド」
- Reactive Extensions再入門 その20「GroupByメソッドでグルーピングしてみよう」
- Reactive Extensions再入門 その21「GroupByUntilメソッド」
- Reactive Extensions再入門 その22「単一の値を取得するメソッド」
- Reactive Extensions再入門 その23「重複を排除するメソッド」
- Reactive Extensions再入門 その24「単一の値を取得するメソッド その2」
- Reactive Extensions再入門 その25「値をまとめるBufferメソッド」
- Reactive Extensions再入門 その26「値をまとめるWindowメソッド」
- Reactive Extensions再入門 その27「時間でフィルタリング?Sampleメソッド」
はじめに
今回はThrottleメソッドです!さくっといきましょう。
Throttleメソッド
ここでは、Throttleメソッドについて説明します。Throttleメソッドは指定した間、新たな値が発行されなかったら最後に発行された値を後続に流すメソッドです。メソッドのシグネチャを以下に示します。
public static IObservable<T> Throttle<T>( this IObservable<T> source, TimeSpan dueTime);
第二引数のdueTimeで後続に値を流すための判断基準になる間隔を指定します。このメソッドの使用例を下記に示します。
var source = new Subject<int>(); // 500ms値が発行されなかったら最後に発行された値を後続に流す source .Throttle(TimeSpan.FromMilliseconds(500)) // 渡ってきた値を時間つきで表示 .Subscribe(i => Console.WriteLine("{0:HH:mm:ss.fff} {1}", DateTime.Now, i)); // 100ms間隔で値を発行 foreach (var i in Enumerable.Range(1, 10)) { // 発行した値を出力しておく Console.WriteLine("{0:HH:mm:ss.fff} OnNext({1})",DateTime.Now, i); source.OnNext(i); Thread.Sleep(100); } // 2000ms sleep Console.WriteLine("{0:HH:mm:ss.fff} Sleep(2000)", DateTime.Now); Thread.Sleep(2000); // 100ms間隔で値を発行 foreach (var i in Enumerable.Range(1, 5)) { // 発行した値を出力しておく Console.WriteLine("{0:HH:mm:ss.fff} OnNext({1})", DateTime.Now, i); source.OnNext(i); Thread.Sleep(100); } // 2000ms sleep Console.WriteLine("{0:HH:mm:ss.FFF} Sleep(2000)", DateTime.Now); Thread.Sleep(2000);
Throttleメソッドで500msの間、値が発行されなかった場合に後続に値を流すようにしています。そのあと、foreachで値を10個100ms間隔で発行して2000msスリープしています。次に、値を5個100ms間隔で発行して、2000msスリープしています。実行結果を以下に示します。
23:05:36.003 OnNext(1) 23:05:36.116 OnNext(2) 23:05:36.217 OnNext(3) 23:05:36.317 OnNext(4) 23:05:36.417 OnNext(5) 23:05:36.517 OnNext(6) 23:05:36.617 OnNext(7) 23:05:36.717 OnNext(8) 23:05:36.817 OnNext(9) 23:05:36.917 OnNext(10) 23:05:37.023 Sleep(2000) 23:05:37.420 10 <- ここ 23:05:39.026 OnNext(1) 23:05:39.126 OnNext(2) 23:05:39.226 OnNext(3) 23:05:39.326 OnNext(4) 23:05:39.426 OnNext(5) 23:05:39.526 Sleep(2000) 23:05:39.926 5 <- ここ
実行結果で「<- ここ」で示している箇所が、Subscribeで出力している箇所です。直前のOnNextから500ms後に出力されていることが確認できます。
このThrottleメソッドは、TextBoxの入力が終わって1秒後に自動で検索処理が実行されるケースなどで使います。