async
C#の新しいasync / awaitキーワードを使用すると、コールバックデリゲートが操作が開始されたスレッドとは異なるスレッドで実行されるため、ThreadStaticデータの使用方法(および使用時期)に影響があります。たとえば、次の単純なコンソールアプリ:
[ThreadStatic]
private static string Secret;
static void Main(string[] args)
{
Start().Wait();
Console.ReadKey();
}
private static async Task Start()
{
Secret = "moo moo";
Console.WriteLine("Started on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Secret is [{0}]", Secret);
await Sleepy();
Console.WriteLine("Finished on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Secret is [{0}]", Secret);
}
private static async Task Sleepy()
{
Console.WriteLine("Was on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1000);
Console.WriteLine("Now on thread [{0}]", Thread.CurrentThread.ManagedThreadId);
}
次の行に沿って何かを出力します:
Started on thread [9]
Secret is [moo moo]
Was on thread [9]
Now on thread [11]
Finished on thread [11]
Secret is []
CallContext.SetData
また、とを使用して実験しCallContext.GetData
、同じ動作をしました。
関連する質問とスレッドを読んだ後:
- CallContextとThreadStatic
- http://forum.springframework.net/showthread.php?572-CallContext-vs-ThreadStatic-vs-HttpContext&highlight=LogicalThreadContext
- http://piers7.blogspot.co.uk/2005/11/threadstatic-callcontext-and_02.html
ASP.Netのようなフレームワークはスレッド間でHttpContextを明示的に移行しているようですが、ではないようです。したがって、キーワードCallContext
を使用しても同じことが起こっているのではないでしょうか。async
await
async / awaitキーワードの使用を念頭に置いて、コールバックスレッドで(自動的に!)復元できる特定の実行スレッドに関連付けられたデータを保存するための最良の方法は何ですか?
ありがとう、