2017-06-28 12 views
1

仮想パスプロバイダを使用して、特定の拡張機能のファイルシステムから項目を取得しています。ベースの実装は、次のCacheDependencyがロード中のキャッシュを破棄していない(仮想パスプロバイダを使用)

 if (Handler != null) 
     { 
      return new MyCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
     } 
     else 
     { 
      return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
     } 

MyCacheDependencyは、対応するCacheItemRemovedCallback

CacheItemRemovedCallback onCacheItemRemoved = new CacheItemRemovedCallback(this.MyCacheItemRemovedCallbackMethod); 
lock (_cache) 
       { 
        _cache.Insert(key, value, new CacheDependency(virtualPath), DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default, onCacheItemRemoved); 
       } 

MyCacheItemRemovedCallbackMethodの私の実装があるが

// I did read that this needs to be a static implementation and thread-safe too 
public void MyCacheItemRemovedCallbackMethod(string key, object value, CacheItemRemovedReason reason) 
     { 
      this.SetUtcLastModified(DateTime.UtcNow); 
      this.Invalidate(); 
      cacheRemoveReason = reason; 

      switch (cacheRemoveReason.ToString()) 
      { 
       case dependencyChanged: 
        { 
         // what should be disposed here? 
         this.CacheDependencyDispose(); 
         this.Dispose(); 
         break; 
        } 
       case expired: 
        { 
         // what should be disposed here? 
         this.CacheDependencyDispose(); 
         this.Dispose(); 
         break; 
        } 
       case removed: 
        { 
         // what should be disposed here? 
         this.CacheDependencyDispose(); 
         this.Dispose(); 
         break; 
        } 
       default: 
         this.CacheDependencyDispose(); 
         this.Dispose(); 
         break; 
      } 
     } 
でHttpContext.Current.Cacheオブジェクト上で次のインサートを使用して返すん

上記はほとんどの環境でチャームのように動作しますが、システムに負荷がかかると、キャッシュはn正しく追い出されている。

問題

この項目は、ファイルシステムに更新されていると同時に、複数の要求がある場合には、重い負荷の下で、たまたまは、リソースに送信します。私はまだキャッシュが削除されていると仮定していますが、私たちのアプリケーションで古いコンテンツを引き続き見ることができます。

ロードが解放されてから期限切れになっても、削除されたユースケースが呼び出されることがわかりました。また、ログにmycallbackメソッドが正しく呼び出されているのを見ることもできますが、Webページはファイルシステムから最新の内容を取得していません。

メモリを解放するために削除が実行されている場合、最新のcache.insertはキャッシュを正しく更新していません。

提案/フィードバック

  • は私が 上記の各シナリオで正しく特定の依存関係を配置しませんよ?どんなフィードバックもありがとうございます。
  • この問題の原因となっている仮想パスプロバイダの設定がありません。
  • を有効または無効にする必要があるアプリケーションまたはページレベルの設定はありますか?
  • 私が紛失している他のアイテムはありますか?

アップデート:私の無効化はNotifyDependencyChanged

base.NotifyDependencyChanged(this, EventArgs.Empty); 

答えて

0

を行い

私は解決策に到着しました。基本的に、NotifyDependencyChangedは、依存関係に追加されたオブジェクトの最終書き込み時刻UTCの値を持っています。

この場合、明示的にthis.UtcLastModifiedをDateTime.Nowに設定する必要はありません。また、CacheItemRemovedCallbackは通知(キャッシュ、ログなど)にのみ使用され、依存関係を破棄するためには使用できないことにも注意してください。

他のベストプラクティスを交渉して、私は以下のコードを動作させることができました。

public void MyCacheItemRemovedCallbackMethod(string key, object value, CacheItemRemovedReason reason) 
     { 
      this.Invalidate(); 
      cacheRemoveReason = reason; 

      switch (cacheRemoveReason.ToString()) 
      { 
       case dependencyChanged: 
        { 
         Log.Debug("I am logging my reason with datetime modified"); 
         break; 
        } 
       case expired: 
        { 
         Log.Debug("I am logging my reason with datetime modified"); 
         break; 
        } 
       case removed: 
        { 
         Log.Debug("I am logging my reason with datetime modified"); 
         break; 
        } 
       default: 
         Log.Debug("I am logging my reason with datetime modified"); 
         break; 
      } 
     } 
関連する問題