ThreadStaticの使いみち

ThreadStaticAttribute という属性の存在に最近気づいた。MSDN によると、static なフィールドに付けることで、そのフィールドをスレッド内で一意にできるみたい。値を設定したスレッドの中でしか、その値を取得できないようになるのか。

using System;
using System.Threading;

namespace ThreadStaticSample
{
    class Program
    {
        [ThreadStatic]
        private static string ThreadStaticMessage;

        private static string StaticMessage;

        static void Main(string[] args)
        {
            ThreadStaticMessage = "Hello, ThreadStatic.";
            StaticMessage = "Hello, Static.";
            Console.WriteLine("メイン:{0}", ThreadStaticMessage);
            Console.WriteLine("メイン:{0}", StaticMessage);

            Thread subThread = new Thread(() =>
            {
                Console.WriteLine("サブ:{0}", ThreadStaticMessage);
                Console.WriteLine("サブ:{0}", StaticMessage);
                ThreadStaticMessage = "Good-by, ThreadStatic.";
                StaticMessage = "Good-by, Static.";
            });
            subThread.Start();
            subThread.Join();

            Console.WriteLine("メイン:{0}", ThreadStaticMessage);
            Console.WriteLine("メイン:{0}", StaticMessage);

            Console.ReadLine();
        }
    }
}

f:id:griefworker:20091221140402p:image

おー、確かに。でも、どこで使う?

そういえば、WCF サービスはデフォルトだと、クライアント毎に処理用スレッドを作成していたな。ThreadStatic を使えば ASP.NET のセッションみたいな機能が実現できるかも…。いや、難しいか。