0

現在、アイテムを MemoryCache.Default インスタンスに挿入しようとしていますが、これは機能します。でもアイテムは無期限!ポーリング間隔はデフォルト設定の 2 分で、MemoryCache に対して特定の設定は行われていません。

アイテムの追加ルーチンは次のようになります。

string key = "someKey";
var faultyItem = GetFaultyItemToBlockFromProcessingTheNextThreeMinutes();

if (!MemoryCache.Default.Contains(key))
{
    MemoryCache.Default.Add(
        new CacheItem(key, faultyItem),
        new CacheItemPolicy() 
        { 
            AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(3)
        });
}

ただし、アイテムがキャッシュ内で期限切れになることはありません。10 分以上待ちましたが、まだキャッシュに残っています。主な目的は、クエリを数秒ごとに処理しようとすることで、データベースがクエリであふれないようにすることです。それらは数秒ごとにチェックされますが、SlidingExpiration はありません。最大遅延はまだ許容できるため、約 3 分後、5 分後に再度チェックする必要があります。

XMLなどで、コード外で構成を行いたくありません。それが不可能な場合、MemoryCache に代わる良い方法はありますか? おそらく、数値/オブジェクトキーと、パラメーターとプロパティによる構成でしょうか?

4

1 に答える 1

2

質問のコード スニペットを使用して、簡単な試用版アプリケーションを最初からセットアップします。私が行った唯一の変更は次のとおりです。var faultyItem = "test";

ステートメントに時計を付けると、MemoryCache.Default.Contains(key)そのステートメントが を返したため、3 分後にそのアイテムがキャッシュから削除されたことが確認されfalseます。

1 つの可能性は、アプリケーションの別の場所で、有効期限のない同じキーを使用してアイテムを既に MemoryCache に入れていることです。絶対的満期。アプリを検索する以外に、これをテストする方法の 1 つは、この特定の操作にデフォルト キャッシュの代わりに名前付きキャッシュを使用して、潜在的な共有使用を特定することです。すなわちstatic MemoryCache testCache = new MemoryCache("TestCache")

于 2014-04-25T03:16:30.083 に答える