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(); } } }
おー、確かに。でも、どこで使う?
そういえば、WCF サービスはデフォルトだと、クライアント毎に処理用スレッドを作成していたな。ThreadStatic を使えば ASP.NET のセッションみたいな機能が実現できるかも…。いや、難しいか。