“HttpContext.Current”プロパティと関連するもののクロススレッド使用

I read from < Essential ASP.NET with Examples in C# > the following statement:

もう一つの便利なプロパティは静的Currentプロパティです
  HttpContextクラスのこのプロパティは常に現在の
  サービスされている要求のHttpContextクラスのインスタンスこの
  使用されるヘルパークラスを作成する場合に便利です
  ページまたは他のパイプラインクラスからアクセスする必要があり、
  何らかの理由で文脈が必要です。静的Currentプロパティを使用して
  コンテキストを取得すると、そのコンテキストへの参照を渡すことを避けることができます
  ヘルパークラス。たとえば、リスト4-1に示すクラスは、
  QueryStringにアクセスして印刷するためのコンテキストの現在のプロパティ
  何かを現在の応答バッファに渡します。 この静的な
  プロパティを正しく初期化するには、呼び出し側が
  元のリクエストスレッドなので、追加のスレッドを生成した場合
  要求中に作業を実行するには、アクセスを提供するように注意する必要があります
  あなた自身のコンテキストクラスに追加することができます。

私は大胆な部分の根本的な原因について疑問に思っており、あるものが別のものにつながる、ここに私の考えがあります:

プロセスは複数のスレッドを持つことができます。これらのスレッドにはそれぞれ独自のスタックがあります。これらのスレッドは共有メモリ領域(ヒープ)にもアクセスできます。

     

スタックは、私が理解するように、そのスレッドのすべてのコンテキストが格納されている場所のようなものです。スレッドがヒープ内の何かにアクセスするには、ポインタを使用しなければならず、ポインタはそのスタックに格納されます。

     

クロススレッドコールを行うときは、必要なコンテキスト情報がすべて呼び出し元スレッドのスタックから呼び出し先スレッドのスタックに渡されるようにする必要があります。

しかし、私が間違いを犯したかどうかはわかりません。

すべてのコメントは深く感謝されます。

ありがとう。

追加

スタックはユーザースタックに制限されています。

ベストアンサー

あなたが求めている行動を引き起こすために一緒に働く4つのことがあります:

  1. HttpContext is an instance object whose reference can be found
    in HttpContext.Current
  2. Thread is also an instance object whose reference can be found
    in Thread.CurrentThread
  3. Thread.CurrentThread is static but references a
    different Thread object in every thread
  4. HttpContext.Current actually points to
    Thread.CurrentThread.ExecutionContext.IllogicalCallContext.HostContext

結論我々は上記のgivensから引き出すことができます:

  1. Because HttpContext is an instance object and not
    static we need its reference to access it
  2. Because HttpContext.Current actually points to a
    property on Thread.CurrentThread, changing
    Thread.CurrentThread to a different object will likely
    change HttpContext.Current
  3. Because Thread.CurrentThread‘ changes when
    switching threads, HttpContext.Current also changes
    when switching threads (in this case
    HttpContext.Current becomes null).

これを一まとめにして、 HttpContext.Current
が新しいスレッドで動作しない原因は何ですか?スレッドの切り替え時に発生する
Thread.CurrentThread 参照の変更により、
HttpContext.Current
参照が変更され、必要なHttpContextインスタンスに到達できなくなります。

繰り返すが、ここで起こっている唯一の魔法は、すべてのスレッドで異なるオブジェクトを参照する
Thread.CurrentThread である。
HttpContextは他のインスタンスオブジェクトと同様に動作します。同じAppDomain内のスレッドは同じオブジェクトを参照できるため、新しいスレッドにHttpContextの参照を渡すだけです。読み込むためのコンテキスト情報などはありません。
(HttpContextの周りを他のスレッドに渡すとかなり深刻な潜在的な問題がありますが、あなたがそれをやるのを妨げるものはありません)。

調査中に私が出会ったいくつかの最終的なメモ:

  1. スレッドのExecutionContextがあるスレッドから別のスレッドに「フロー」(コピー)されることがあります。なぜ、HttpContextは新しいスレッドに「流れ」ませんか?
    HttpContextはILogicalThreadAffinativeインターフェイスを実装していないためです。
    ExecutionContextに格納されているクラスは、ILogicalThreadAffinativeを実装している場合にのみフローされます。

  2. ASP.NETはHttpContextをスレッドからスレッドに(スレッド –
    アジリティ)が流れていない場合、どのように動かすのですか?私は完全にはわかっていませんが、
    HttpApplication.OnThreadEnter()に渡す可能性があります。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です