2012-02-24 21 views
7

背景:ASP.NET MVC 3 Webアプリケーションを作成しています。便利な自動期限切れ機能とスレッドセーフティのために、キャッシュに保持したいオブジェクトのList<MyObject>(実際にはいくつかのリスト)があります。System.Web.Caching.Cacheはキャッシュからオブジェクトを削除しますか?

これらの各オブジェクトには、内部サーバープッシュの実装に使用されるSystem.Threading.Semaphoreのインスタンスが内部的に含まれています。

私はオブジェクトのライフサイクルをキャッシュに入れれば、どのように変わるのだろうか?キャッシュが/ etcをパージするオブジェクトを実際に処分すると、スレッド/ NullReferenceExceptionsに問題が生じることがありますか?たぶんこれをしないいくつかの他の明らかな理由は?

TIA。

答えて

9

オブジェクトが何らかの理由でキャッシュから取り出されたときに、キャッシュが明示的にオブジェクトを破棄することはありません。あなたはそれをテストすることによって、これを証明することができますが、このケースだった場合には、ドキュメントにあるであろう、とそうではありません。

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx

キャッシュ内のオブジェクトのライフサイクルは、中にあることによって延長することができますキャッシュはそのキャッシュへの参照を保持しているためです。これを避けたいのであれば、代わりに弱参照をキャッシュすることができます。

http://msdn.microsoft.com/en-us/library/system.weakreference.aspx

あなたがこれを行う場合は、キャッシュ内の参照を格納のないライフサイクルの影響があってはなりません。

スレッドセーフであるため、キャッシュを使用したいと考えています。キャッシュオブジェクト自体はスレッドセーフですが、スレッドセーフではないオブジェクトをキャッシュにキャッシュすると、キャッシュされたオブジェクト自体が自動的にスレッドセーフにならないことに注意してください。具体的にはList<T>はスレッドセーフではなく、キャッシュに格納してもこれは変わりません。スレッドの安全を確保する場合は、コンカレントコレクションを使用します。

+0

答えをありがとう!今私はもう少し快適に感じます。私はライフサイクルを延長する気にしない - これは私のためにこのソリューションのためのポイントを追加することさえできます。最近の回答がもう表示されない場合、私はあなたの答えを受け入れるでしょう。 –

+3

削除コールバックメソッドを指定することにより、必要に応じてオブジェクトを破棄することができます。 – Rozwel

+0

@Rozwel:ありがとう、私はそれを理解しています。オブジェクトが自動的に削除されないようにすることができます。 –

関連する問題