2016-09-08 5 views
0

内の項目を更新しない:MemoryCacheは、私は私の問題を実証する(linqpadで)次のコードを記述Updatecallback

void Main() 
{ 
    var waitEvent = new AutoResetEvent(false); 
    MemoryCache.Default.Set(
     "test", 
     "value", 
     new CacheItemPolicy 
     { 
      AbsoluteExpiration = DateTimeOffset.UtcNow.Add(TimeSpan.FromSeconds(5)), 
      UpdateCallback = (CacheEntryUpdateArguments e) => { 
       waitEvent.Set(); 
       e.Dump(); 
       e.UpdatedCacheItem = new CacheItem(e.Key, "value2"); 
      } 
     }); 

    MemoryCache.Default.Get("test").Dump(); 
    waitEvent.WaitOne(); 
    waitEvent.WaitOne(TimeSpan.FromSeconds(10)); 


    MemoryCache.Default.Get("test").Dump(); 

} 

// Define other methods and classes here 

結果は以下の通りです:

enter image description here

誰もが理由を説明することができます私は結果として "value2"を得ることができないのですか?

答えて

0

UpdatedCacheItemに新しい項目を割り当てるときにも、新しいポリシーを割り当てる必要があります。ドキュメントはかなりおしゃれです(UpdatedCacheItemは必須と言われているようですが、UpdatedCacheItemPolicyはオプションです()。ただし、ソースは、それが明らかに:

// invoke update callback 
try { 
    CacheEntryUpdateArguments args = new CacheEntryUpdateArguments(cache, reason, entry.Key, null); 
    entry.CacheEntryUpdateCallback(args); 
    Object expensiveObject = (args.UpdatedCacheItem != null) ? args.UpdatedCacheItem.Value : null; 
    CacheItemPolicy policy = args.UpdatedCacheItemPolicy; 
    // Dev10 861163 - Only update the "expensive" object if the user returns a new object, 
    // a policy with update callback, and the change monitors haven't changed. (Inserting 
    // with change monitors that have already changed will cause recursion.) 
    if (expensiveObject != null && IsPolicyValid(policy)) { 
      cache.Set(entry.Key, expensiveObject, policy); 
    } 
    else { 
      cache.Remove(entry.Key); 
    } 

IsPolicyValidリターンをfalsepolicynullある場合。


引用:

あなたはUpdatedCacheItemプロパティにCacheItemオブジェクトを割り当て、対UpdatedCacheItemPolicy財産

CacheItemPolicyオブジェクトを割り当てる必要があります。

は、必要に応じて、私はポリシーを与えることを試みる実際にUpdatedCacheItemPolicyプロパティ

+1

CacheItemPolicyオブジェクトを割り当てることができますが、それは動作しません。しかし、あなたの答えは、詳細についてソースコードをチェックできるということを思い出させます。そのため、ソースコードでは、ポリシーは1)モニタに変更がない場合のみ有効です。2)新しいポリシーのコールバック関数があります。私は、なぜ私は新しいupdatecallback関数を与える場合、アイテムがコールバックがあるときにのみ更新することができないのか分からない、結果は正しいでしょう。だから、同じことに感謝します。 – winterTTr

関連する問題