CacheItemPolicyのAbsoluteExpirationプロパティについて混乱しています。
MSDNのドキュメント は、「キャッシュエントリが削除されるまでの期間」を示しています。 System.DateTimeOffsetを使用して「期間」を定義します。
しかし、 DateTimeOffsetのMSDNドキュメント を見ると、「特定の時点を表している...協定世界時(UTC)に関連している」と書かれています。これも参照 StackOverflowスレッド 。
あなたは問題を見ますか? AbsoluteExpirationは「期間」(5秒や2時間など)を期待しますが、「時点」(2012年12月21日、06:14:00 ESTなど)を表すオブジェクトが必要です。
以下のコードでは、すべてのアイテムに対して単一のポリシーを定義しています。すべてのアイテムが追加されてからcacheExpiryInSeconds
秒後に期限切れになりたい。誰かがこれが正しい方法で行われていることを確認できますか?
public class MyCache : IRoutingInfoCache
{
MemoryCache _routingInfoCache;
CacheItemPolicy _cachePolicy;
public MyCache(int cacheExpiryInSeconds)
{
_routingInfoCache = new MemoryCache("myCache");
_cachePolicy = new CacheItemPolicy() {
AbsoluteExpiration =
new DateTimeOffset(
DateTime.UtcNow.AddSeconds(cacheExpiryInSeconds))
};
}
public void Put(string key, object cacheItem)
{
// based on how I constructed _cachePolicy, will this item expire
// in cacheExpiryInSeconds seconds?
_routingInfoCache.Add(new CacheItem(key, cacheItem), _cachePolicy);
}
}
キャッシングはUTC時間に準拠して均一な時間計算を提供するため、キャッシュされたエントリが期限切れになる時点をUTCで指定すると、キャッシュは適切な時間差を計算し、期待どおりに期限切れになります。
絶対有効期限はbeforeであるため、コードは期待どおりに機能しません。cacheExpiryInSeconds
秒が経過するとキャッシュアイテムが入力され、結果としてimmediateが削除されます。近い将来AbsoluteExpirationが設定されている場合、CacheItemPolicyインスタンスを共有することはできません。 :)