2016-09-08 4 views
0

Я пишу следующий код (в LINQPad), чтобы продемонстрировать свою проблему:MemoryCache не уточняет деталь в 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 возвращает false если policy является null.


Цитаты:

вы должны назначить CacheItem объект в UpdatedCacheItem собственности и назначить CacheItemPolicy объект в UpdatedCacheItemPolicy собственности

против:

можно дополнительно назначить CacheItemPolicy объект в UpdatedCacheItemPolicy собственности

+1

На самом деле я стараюсь дать политику, но она не работает. Но ваш ответ напоминает мне, что я могу проверить исходный код на детали, поэтому в исходном коде политика действительна только в том случае, если 1) нет изменений в мониторинге 2) есть функция обратного вызова для новой политики. Я понятия не имею, почему элемент может обновляться только при обратном вызове, если я дам новую функцию updatecallback, результат будет верным. Так что спасибо все равно. – winterTTr