.NETFrameworkのバージョン4.0以降でExecutionContextが実際にどのように機能するかを調べようとしています。ドキュメントには、Thread.Startおよびほとんどのスレッドプール操作を使用する場合、マネージドプリンシパル、同期、ロケール、およびユーザーコンテキストがすべて新しいスレッドに流れると記載されています。しかし、私はこれが実際に機能しているのをまったく見ることができません。
これは、新しいスレッドを開始するときに同期コンテキストとマネージドプリンシパルが流れるかどうかをテストする単純なコンソールアプリケーションです...
static void Main(string[] args)
{
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("One"), null);
Thread t1 = new Thread(new ThreadStart(ThreadRun));
t1.Start();
t1.Join();
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("Two"), null);
AsyncFlowControl aFC = ExecutionContext.SuppressFlow();
Thread t2 = new Thread(new ThreadStart(ThreadRun));
t2.Start();
t2.Join();
aFC.Undo();
Console.Read();
}
static void ThreadRun()
{
Console.WriteLine("ThreadRun Id={0} Context={1} Principle={2}",
Thread.CurrentThread.ManagedThreadId,
(SynchronizationContext.Current != null),
Thread.CurrentPrincipal.Identity.Name);
}
結果は...
ThreadRun Id=11 Context=False Principle=One
ThreadRun Id=12 Context=False Principle=Two
したがって、同期コンテキストはフローせず、マネージドプリンシパルは、指定しない場合でも常にフローします。基本的に、ドキュメントは完全に間違っています。では、ExecutionContextが実際に何をするのか、そしてなぜそれが役立つのかについての説明はありますか?