かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Reactive Extensions再入門 その29「値を指定した時間だけ遅延させるDelayメソッド」

過去記事インデックス

はじめに

今回は、Delayメソッドです。Reactive Extensionsのデモとして、とても魅せやすいメソッドですね!シンプルなのでさくっといきましょう。

Delayメソッド

ここでは、Delayメソッドについて説明します。Delayメソッドは名前が示す通りIObservableのシーケンスから発行された値を指定した時間だけ遅延させて後続に流すメソッドになります。
メソッドのシグネチャを以下に示します。

public static IObservable<T> Delay<T>(
    this IObservable<T> source, 
    TimeSpan dueTime);

引数のdueTimeで遅延させる時間を指定します。TimeSpan型を受け取る以外にも、特定の時点まで遅延させることも出来ます。このメソッドのコード例を下記に示します。

var source = new Subject<int>();
source
    // 10秒遅延させる
    .Delay(TimeSpan.FromSeconds(10))
    // 値を時間つきで表示させる
    .Subscribe(i =>
        Console.WriteLine("{0:HH:mm:ss.fff} {1}", DateTime.Now, i));

// 1秒間隔で1〜5の値を発行
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(1000);
}

// 終了待ち
Console.WriteLine("Please enter key");
Console.ReadLine();

Delayメソッドを使ってIObservableのシーケンスから発行された値を10秒遅延させています。実行結果を以下に示します。

21:58:12.174 OnNext(1)
21:58:13.202 OnNext(2)
21:58:14.202 OnNext(3)
21:58:15.202 OnNext(4)
21:58:16.202 OnNext(5)
Please enter key
21:58:22.214 1
21:58:23.205 2
21:58:24.202 3
21:58:25.216 4
21:58:26.215 5

実行結果からわかるように、OnNextで発行した値が10秒後に表示されています。このようにDelayメソッドを使うと、値を遅延させて後続に流すということが実現できます。