5

かなりのグーグルの後、HttpContextのスレッドセーフに関する信頼できる決定的な情報は見つかりませんでした。

私は次のようなシナリオを見ています:

public class AsyncHandler : IAsyncHttpHandler 
{
   void BeginProcessRequest(...)
   {
      // Spawn some tasks in parallel, provide them with current HttpContext as argument.
   }

   void EndProcessRequest(...) {...}
}

私の(ioバウンドの)並列タスクは、潜在的に同時にHttpContextにアクセスしたいと思うでしょう。

いろいろな投稿を見てみる、これは安全なようですが、実際の証拠が欲しいです。もちろん、MSDNは通常の「統計はスレッドセーフなど」を提供しますが、これはスレッドセーフではないと想定する以外には役に立ちません。

StackOverflowに関するさまざまな投稿(ここ、ここ、またはここなど)を見てきました、この質問に対する実際の答えはありません。

.NET 4.5でのすべての非同期動作では、HttpContextがスレッドセーフでない場合は少し奇妙に思えますが、実際にそうでない場合は、そうする方法はありますか?私は考えることができます:

  • クローンを作成します(ただし、一見不可能ではないように見えますが、これはそれほど簡単ではありません)。
  • HttpContextBaseをラップし、このスレッドを安全にします(ねえ、私はそれをHttpContextWrapperWrapperと呼びます)。

しかし、これはすべて少しくだらないとあまりにも多くの作業を感じます。

編集:これをより詳細に調べ、後でいくつかの反射を行った後、HttpContextがスレッドセーフでないことは実際には問題ではないと思います。これについては、このブログ投稿で詳しく説明しました。要点は、ASP.NETで正しいSynchronizationContextを使用することで、一度に1つのスレッドのみがコンテキストにアクセスできるようにすることです。

4

1 に答える 1

8

HttpContextクラスはスレッドセーフではありません。

たとえば、HttpContext.Itemsプロパティは非同期のハッシュテーブルへの単なる参照であるため、これは明らかにスレッドセーフではありません。

並列タスク間で何を共有したいかは質問から明確ではありませんが、既存のクラスをラップするのではなく、独自のスレッドセーフクラスのインスタンスを使用してタスク間で状態を共有することをお勧めします。

于 2012-11-17T18:45:21.257 に答える