2016-09-08 3 views
0

schreibe ich den folgenden Code (in LINQPad) mein Problem zu demonstrieren:Memory nicht aktualisieren Artikel in 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 

Das Ergebnis ist wie folgt:

enter image description here

Kann mir jemand erklären, warum Ich kann "value2" nicht als Ergebnis bekommen?

Antwort

0

Sie müssen eine neue Richtlinie auch beim Zuweisen eines neuen Elements zu UpdatedCacheItem zuweisen. Die Dokumente sind ziemlich wackelig-verwaschen (UpdatedCacheItem scheint zu sagen, dass es erforderlich ist, UpdatedCacheItemPolicy scheint zu implizieren, es ist optional). Allerdings macht die Quelle klar:

// 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 kehrt false wenn policynull ist.


Zitate:

müssen Sie ein CacheItem Objekt die UpdatedCacheItem Eigenschaft zuweisen und ein CacheItemPolicy Objekt an die UpdatedCacheItemPolicy Eigenschaft

im Vergleich zu:

Sie können ein CacheItemPolicy Objekt an die UpdatedCacheItemPolicy Eigenschaft

+1

In der Tat optional ordne ich versuchen, eine Richtlinie zu geben, aber es funktioniert nicht. Aber Ihre Antwort erinnert mich daran, dass ich den Quellcode über das Detail überprüfen kann. Daher ist die Richtlinie im Quellcode nur gültig, wenn 1) keine Änderung am Monitor erfolgt. 2) Es gibt eine Callback-Funktion für neue Richtlinien. Ich habe keine Ahnung, warum das Element nur aktualisiert werden kann, wenn es einen Rückruf gibt, wenn ich eine neue updatecallback-Funktion gebe, wird das Ergebnis korrekt sein. Also trotzdem danke. – winterTTr

Verwandte Themen