2009-04-09 12 views
2

私は、C#で特定のアイテムをあらかじめ定義した時間キャッシュしたい(1時間と言う)コンソールアプリケーションを作成しています。このキャッシュに追加されたアイテムは、期限が切れた後に自動的に削除されます。私が使用できるビルトインのデータ構造はありますか?これはコンソールアプリで、ウェブアプリではないことを忘れないでください。C#アイテムの有効期限が切れたコレクション

答えて

3

私はこれを行うBCLのどのオブジェクトも知りませんが、私はこれまでに同様のことを書いています。

キャッシングクラスの内部にSystem.Threading.Timer(web/winformsの依存関係なし)を含め、オブジェクトに有効期限(または最後に使用された)時間を格納するだけで、これを簡単に行うことができます。数分ごとにタイマーのチェックを行い、期限切れにするオブジェクトを削除してください。

ただし、あなたのオブジェクトのイベントを注意してください。私はこのようなシステムを持っていて、キャッシュ内のオブジェクトのイベントからの退会を非常に慎重にしていませんでした。これはデバッグするのが非常に難しい場合があります。

6

実際にキャッシュから削除する必要がありますか?または、そのアイテムのキャッシュへの将来の要求は、指定された時間の後にnullを返す必要がありますか?

これを行うには、定期的にキャッシュをパージしていた何らかのバックグラウンドスレッドが必要です。これは、あなたがメモリ消費などを心配していた場合にのみ必要となります。データを期限切れにしたいだけなら、簡単に行うことができます。

このようなクラスを作成するのは簡単です。

class CachedObject<TValue> 
{ 
DateTime Date{get;set;} 
TimeSpan Duration{get;set;} 
TValue Cached{get;set;} 
} 

class Cache : Dictionary<TKey,TValue> 
{ 
    public new TValue this(TKey key) 
    { 
    get{ 
    if (ContainsKey(key)) 
    { 
     var val = base.this[key]; 
     //compare dates 
     //if expired, remove from cache, return null 
     //else return the cached item. 
    } 
    } 

    set{//create new CachedObject, set date and timespan, set value, add to dictionary} 

    } 
3

は、あなたが(あなたの本当のオブジェクトの周りに、おそらくラッパー)をキャッシュし、そのコンストラクタで時間で期限切れになるように設定されるオブジェクトで、ExpirationDateとプロパティを含めます。コレクションからアイテムを削除する代わりに、期限切れのアイテムを除外する方法でコレクションにアクセスします。または、これを自動的に行うカスタムコレクションを作成します。実際にキャッシュからアイテムを削除する必要がある場合、カスタムコレクションはそのメンバーのいずれかの呼び出しごとに期限切れのアイテムをパージすることができます。

6

すでにBCLにあります。その場所を見つけようと思っている場所ではありません。ASP.NETだけでなく、他の種類のアプリケーションからSystem.Web.Cachingを使用することもできます。

This search on google links to several resources about this.

+3

見る代わりにhttp://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.100).aspx MemoryCacheを使用します。http:// stackoverflowの.com/a/793720/303290 tl; dr: "CacheオブジェクトがASP.NET以外で使用されている場合、Cacheオブジェクト用に予約されているシステムメモリは解放されません" – mbx

関連する問題