2009年10月14日

【ラムダ式】 ThreadクラスとThreadStartデリゲート

前回の続きです。
今回は、ラムダ式が上位スコープの変数にアクセス出来ることを利用した実用的な例を示します。
Threadクラスは、別スレッドで処理するメソッドをThreadStartデリゲート型で受け取ります。
このThreadStartデリゲートにラムダ式を使用することが出来ます。
以下のコードを御覧ください。

class Program
{
    static void Main(string[] args)
    {
        string message = "スレッド内で表示する文字列:";
        // 別スレッドで処理するラムダ式
        ThreadStart action = () =>
        {
            for (int i = 0; i < 5; i++)
            {
                // 1秒スリープ
                Thread.Sleep(1000);
                // Mainメソッドのローカル変数を参照
                Console.WriteLine(message + i);
            }
            // Mainメソッドの引数を参照
            Console.WriteLine("argsの型={0}, argsのレングス={1}",
                                      args.ToString(), args.Length);
        };

        // スレッドクラスにThreadStartデリゲート(今回はラムダ式)を渡す
        Thread thread = new Thread(action);
        // スレッド開始
        thread.Start();
        // スレッド終了まで待つ
        thread.Join();

        // <結果>
        //スレッド内で表示する文字列:0
        //スレッド内で表示する文字列:1
        //スレッド内で表示する文字列:2
        //スレッド内で表示する文字列:3
        //スレッド内で表示する文字列:4
        //argsの型=System.String[], argsのレングス=0
    }
}
System.Threading名前空間のThreadStartデリゲートは、public delegate void ThreadStart ()と定義されており、これは引数なし、戻り値voidのメソッドのみ指定出来ることを意味しています。
Threadクラスには素直に引数を渡すことが出来ないので、パラメータを渡すのは多少工夫が必要です。
しかし、このThreadStartデリゲートにラムダ式を適用する事で、簡単にスレッド処理側にパラメータを渡すことが可能です。
上記のサンプルコードの例では、ラムダ式actionの中でMainメソッドのローカル変数messageとMainメソッドの引数argsを参照しています。
ラムダ式なら、引数として渡していない変数でもスレッド内で参照出来るのです。
サンプルの為に即興で考えたコードですが、今まであまり使ったことが無かったThreadクラスを一度使ってみたら面白いかなと思いました。

ラムダ式の先頭記事へ ラムダ式の次の記事へ
ラベル:ラムダ式
posted by 吾一 at 00:12| 2. ラムダ式 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。