2013-06-06 12 views
23

CacheItemPolicyのAbsoluteExpirationプロパティを混同しています。.NETでCacheItemPolicy経由でキャッシュされたアイテムを期限切れにするMemoryCache

The MSDN documentation for itは、「キャッシュエントリが削除されるまでに経過しなければならない期間」と述べています。 System.DateTimeOffsetを使用して「期間」を定義します。

しかし、DateTimeOffset's MSDN documentationを見ると、「協定世界時(UTC)に関連する時点を表しています」と表示されます。このStackOverflow threadも参照してください。

問題が表示されますか? AbsoluteExpirationでは、「時間帯」(5秒または2時間など)が必要ですが、「時刻」を表すオブジェクトが必要です(2012年12月21日、06:14:00 ESTなど)。

以下のコードでは、すべてのアイテムに対して1つのポリシーを定義しています。私は、すべてのアイテムが期限切れになるようにしたいのですが、追加した後には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); 
    } 
} 

答えて

15

キャッシュを使用すると、キャッシュされたエントリはUTCで、有効期限が切れるべき時点を指定して、均一な時間の計算を提供するためにUTC時刻に付着し、キャッシュが今から適切な差異を計算して、それを期限切れになります期待される。期待どおりに絶対有効期限がcacheExpiryInSeconds即時立ち退きで、その結果、合格したら、あなたのキャッシュ項目が入力される前になりますので、

あなたのコードは動作しません。 AbsoluteExpirationが近い将来に設定されている場合、CacheItemPolicyインスタンスを共有することはできません。 :)

+1

どこに30秒かかりましたか? –

+0

間違いでした。編集されました。 – Haney

+1

しかし、上記のコードを使用してキャッシュポリシーを作成すると、アイテムを追加するたびに期待どおりに機能するはずです。 –

関連する問題