2016-05-03 14 views
1

私は現在、各ユーザーのWeb要求ごとにアプリケーション全体で現在のユーザーのIDを保持するためにThreadlocalを使用しています。低い環境でHttpContextにアクセスすることはできませんが、どこでもパラメータとして渡すことなく静的なUserIdにアクセスしたいと考えています。 最近、私はasync/await.介して並列演算を追加してきた。これは、もはや私は研究と.Net 4.6AsyncLocalを発見し、各Task.CallContext.LogicalGetData()vs ThreadLocal/ThreadStatic

で適切な値を持って保証することはできませんが、現在.Net 4.5.1に制限されています。代わりに、CallContext.LogicalGet/SetData()は私が探しているものを達成することができますか?

+0

このパラメータをより適切に渡します。あなたはあなたのデザインを複雑にしています。 –

答えて

2

はい、論理呼び出しコンテキストはasync-localとして機能します。

AsyncLocal<T>は、完全な.NETフレームワーク上で論理的な呼び出しコンテキストを使用します。これは、より良いAPIを備えており、論理的な呼び出しコンテキストではなく、今後の.NETコアプラットフォームで動作します。

私のブログで説明しているように、only store immutable dataを覚えておいてください。

また、非同期ローカル値には明確なパフォーマンスの影響があります。パラメータを明示的に渡すことは、おそらくあなた自身のRequestContext型の一部として、より確実に実行されるでしょう。 ASP.NET vCoreはHttpContext.Currentから移動しています。それはまだHttpContextという概念を持っていますが、もはや非同期ローカルとしては機能しません。明示的に渡されます。

+0

ありがとう、@Stephen! – Ermish

+1

CallContextより5倍遅く動作します... – Maxim

+0

@ Maxim:本当ですか?私は 'AsyncLocal 'が 'CallContext.Logical *'より5倍遅くなるのではないかと疑います。 –