2

私のasp.netアプリケーションでは、いくつかのデータをにキャッシュしたいと思いますHttpApplicationState

データを設定するための私のコードは次のようになります。

 Application.Lock();

 Application.Set("Name", "Value");

 Application.UnLock();

ドキュメントを読むと、それHttpApplicationStateは暗黙的にスレッドセーフであると書かれています。しかし、多くのブログでは、にデータを書き込むときに使用する必要があるApplication.Lock()と書かれています。Application.Unlock()HttpApplicationState

一方、メソッドからデータを読み取るとき、HttpApplicationStateまたはメソッドをクリアするとき(を使用してApplication.RemoveAll())にロックを使用する必要があるというドキュメントは見つかりませんでした。

私の質問は次のとおりです。

  1. 電話をかけるときは、スレッドセーフに注意を払うべきではありませんRemoveAllか?私のアプリケーションでは、1つのスレッドがからデータを読み取っているのHttpApplicationStateに対し、他のスレッドはを呼び出す可能性がありますRemoveAll
  2. この場合、HttpApplicationState2つの異なるスレッドから同時に読み取りとクリアが可能な場合、読み取りもスレッドセーフではないでしょうか。
4

2 に答える 2

3

ロックが必要になるのは、アプリケーションの状態に対して複数の操作を実行している場合のみです。あなたの場合、あなたはただ一つの操作をしているので、それはロックなしで完全に安全です:

Application.Set("Name", "Value");

複数の操作を実行し、それらが相互に依存している場合は、ロックが必要です。例えば:

Application.Lock();

string name = Application.Get("Name");

if (name == null) {
  Application.Set("Name", "Value");
}

Application.UnLock();
于 2013-03-26T08:10:39.813 に答える
1

私の知る限り、RemoveAllは内部でClearメソッドを呼び出すため、スレッドセーフです。ClearメソッドはHttpApplicationStateLock.AcquireWriteを呼び出してから、base.BaseClearを呼び出し、最後にロックを解放します。

HttpApplicationStateもご覧ください -スレッドセーフな場合に競合状態が存在するのはなぜですか?

于 2013-03-26T05:52:07.500 に答える