ExecutionContext
インスタンスの格納を担当するASP.NETは、HttpContext.Current
他のスレッドに自然に「流れる」ことはありません。エラースタックトレースから判断すると、ASP.NET MVCで作業しています。これは、の使用を抽象化するフレームワークですHttpContext
。あなたはおそらく、直接使用するのが一般的なWebFormsのバックグラウンドから来たのでしょうか。
同期コンテキスト
この記事は、私が合理的に説明できるよりもはるかに詳細な情報を提供します。ただし、状況に最も関連するポイントのいくつかは次のとおりです。
「ExecutionContextはすべて「環境」情報に関するものです。つまり、現在の環境または実行している「コンテキスト」に関連するデータを格納します。」
この「周囲の」情報は...HttpContext.Current
およびそのさまざまなプロパティ(を含むSession
)です。
「これは、TLSがこれらの非同期ポイント間を「フロー」しないため、実行の詳細を制御するために依存するようになったこのアンビエントコンテキストが実行できなくなったことを意味します。」
TLSはthread-local-storage(HttpContext.Current
など)です。要するに、async=は潜在的に失われHttpContext.Current
ます。
MVCの方法
MVCはほとんど抽象化されていると言ったことを覚えていHttpContext
ますか?
Session
Controller.Sessionにあります。(申し訳ありませんが、非同期コントローラーアクションでこれをテストしていないため、まだニーズに適しているかどうか、または連携させるために追加の作業が必要かどうかを確認できません。)
Request
Controller.Requestにあります
User
Controller.Userにあります
他にもあります...それらをチェックしてください。
セッションの選択肢?
代替案を検討しましたか?Session +ASP.NETMVCが悪い考えであることを示唆する記事を見つけるために遠くを見る必要はありません。「悪いこと」であるかどうかという一般的なことを検討するつもりはありませんが、あなたの例を見ると、「セッション」データではなく、ユーザープロファイルデータを扱っているように見えます。
セッションは、ユーザープロファイル情報をキャッシュするのに実際には適切な場所ではありません。さらに言えば、それをキャッシュするのは適切ですか?セッション中にユーザープロファイルを変更できますか?彼らが自分で変更した場合、セッションをリセットしますか?別の管理者ユーザーがログイン中にプロファイルを変更した場合はどうなりますか?
代替案を探すことはこの質問の範囲を超えていますが、ここで間違った問題を解決しようとしている可能性があることに注意してください。