39

スコット・ハンセルマンはそう言います

Web 以外のプロジェクトに System.Web を追加することは、人々をパニックに陥らせる良い方法です。もう 1 つは、C# アプリケーションで Microsoft.VisualBasic への参照を追加することです。ただし、どちらも合理的であり、非常に便利なことです。

MSDNはノーと言います。

Cache クラスは、ASP.NET アプリケーション以外で使用するためのものではありません。Web アプリケーションにキャッシュを提供するために、ASP.NET で使用するために設計およびテストされました。コンソール アプリケーションや Windows フォーム アプリケーションなど、他の種類のアプリケーションでは、ASP.NET キャッシュが正しく機能しない場合があります。

では、どう考えればよいのでしょうか。

4

8 に答える 8

27

この質問は古いと思いますが、検索でこれを見つけた人を助けるために、.net v4 にはこのタイプのシナリオ用の新しい汎用キャッシュが含まれていることに注意してください。System.Runtime.Caching 名前空間にあります。

https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx

デフォルトのキャッシュ インスタンスへの静的参照は、MemoryCache.Default です。

于 2010-05-05T08:08:48.220 に答える
5

HttpRuntime.Cache を使用しても問題はありません。これは、Web コンテキストの外で非常に役立つ洗練されたメモリ内ハッシュ テーブルです。それでも、HTTP に関連しないアプリケーションで HttpRuntime.Cache を参照するのは少しコードの匂いがするかもしれないので、何らかの ICache インターフェイスの背後にラップして、可能な限りそれを使用することをお勧めします。

于 2008-10-01T17:23:05.360 に答える
4

覚えておくべきことの 1 つは、Microsoft が .NET Framework Client Profile Setup Package をリリースしたことです。これは、クライアント アプリケーションを対象とした 3.5 フレームワークのバージョンであり、フットプリントが縮小されています。クライアント プロファイルには、フレームワークの ASP.NET 部分は含まれません。

アプリケーションが System.Web に依存している場合、アプリケーションはクライアント プロファイルを利用できなくなります。

詳細については、 Scott Gu のブログを参照してください。

于 2008-10-01T17:22:29.387 に答える
2

Insert()現在のバージョンの System.Web.Caching.Cache には、 を受け入れるメソッドを 除いて、HTTP ランタイムに依存するものは何もないように思われるCacheItemUpdateCallbackため、ほとんどの場合、Scott は正しいです。

これは、Microsoft が将来クラスを変更して、HTTP インフラストラクチャとの統合を強化することを妨げるものではありません。

別の回答でWeakReferenceベースの軽量キャッシュを作成しました。

于 2008-10-01T17:27:57.720 に答える
1

一度使用したことがありますが、気分が悪く、IIRC によってメモリ フットプリントが大幅に増加しました。代わりに、驚くほど簡単に実行できる独自の軽量キャッシュ メカニズムを実装しました。

キャッシュがオブジェクトへの参照を保持できるようにするWeakReferenceクラスを利用していましたが、参照が使用されていない場合はガベージ コレクターがメモリを再利用できるようにもしていました。

私が持っていなかった唯一のものは、キャッシュ内の古いアイテムをクリーンアップするための別のスレッドでした. 私がしたことは、キャッシュに x 個以上のアイテムが含まれていた場合、キャッシュされたすべてのアイテムを調べて、新しいアイテムを追加する前に古いアイテムを削除することでした。

より堅牢なものが必要な場合は、MS Enterprise Library Caching Application Blockなどを使用してください。

于 2008-10-01T20:35:55.257 に答える
1

使用しないでください。動作する場合でも、次のサービス パック/バージョンで動作しなくなる可能性があります。

契約 (この場合は MSDN) ではなく、内部実装の詳細に基づいて何かを行った瞬間に、将来トラブルに巻き込まれることが予想されます。

于 2008-10-01T17:22:58.323 に答える
1

一般的な解決策を探している場合: これは、依存性注入アプローチの典型的な状況です。このアプローチを使用すると、Scott HanselmanMSDN に従うことができます!

ライブラリに System.Web 参照を持たずに、HttpRuntime.Cache のような System.Web 依存関係を挿入します。

于 2010-05-05T13:50:39.990 に答える
0

質問を完全に避けて、Enterprise Library の Caching Block を使用してみませんか? System.Web.Caching を使用することもできますが、問題が発生した場合に Microsoft のサポートを受けることができず、眉をひそめる可能性があるため、価値がない可能性があります。

于 2008-10-01T17:21:18.157 に答える