2016-05-23 10 views
2

次のコードに問題があります。私は次のコードを持っています。HttpRuntime.Cacheの有効期限はありませんか?

  if (HttpRuntime.Cache[cacheKey] == null) 
      { 
       AddTask(cacheKey, JsonConvert.SerializeObject(result), 60 * 30); 
      } 
      r = JsonConvert.DeserializeObject<Result>(HttpRuntime.Cache[cacheKey].ToString()); 
      HttpRuntime.Cache[cacheKey] = JsonConvert.SerializeObject(r); 


      private static void AddTask(string key, string value, int seconds) 
      { 
       HttpRuntime.Cache.Insert(key, value, null, 
        DateTime.Now.AddSeconds(10), Cache.NoSlidingExpiration, 
        CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(CacheItemRemoved)); 
      } 

    public static void CacheItemRemoved(string k, object v, CacheItemRemovedReason r) 
    { 
    } 

私がやっていることは、単にキャッシュを追加して(存在すれば)更新することです。 10秒後に何かを点検したい。しかし、私のCacheItemRemovedコールバックは決して呼び出されませんでした。

+0

アイテムが削除されるという保証はありません。これはキャッシュのポイントではありません。ここで何をしようとしていますか? – Luaan

+0

キャッシュ内の項目を追加および更新します。いくつかの間隔の後に私はキャッシュを削除したいとコールバックですべてのキャッシュデータを保存します。 – SAL

+0

さて、「キャッシュ」はそのためには機能しません。 1つは、アイテムが削除されたことを保証するものではなく、2つの理由でアイテム*が削除されたときにコールバックが呼び出され、実行が終了することを保証するものではありません。これはキャッシュであり、書き込みバッファではありません。書き込みバッファが必要な場合は、独自のバッファを作成する必要があります。 – Luaan

答えて

1

史上デフォルトの時間に、キャッシュ時間のリセット

HttpRuntime.Cache[cacheKey] = JsonConvert.SerializeObject(r); 

を使用してキャッシュを更新。今は文字列を使用する代わりにcache.itsを更新せずにオブジェクトインスタンスを使用しました

notification = HttpRuntime.Cache[cacheKey] as Notification; 
HttpRuntime.Cache.Insert(key, notificationResult , null, 
       DateTime.Now.AddSeconds(10), Cache.NoSlidingExpiration, 
       CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(CacheItemRemoved)); 
関連する問題