Имам WCF услуга, която внедрява персонализиран ObjectCache за кеширане на COM обект на трета страна за взаимодействие със среда 3270.
Този обект на трета страна работи на лицензиран модел, така че е наложително моят RemovedCallBack да се извиква всеки път, когато даден обект бъде премахнат от кеша, за да се освободят лицензи.
Проблемът ми е, че продължавам да получавам използвани лицензи, но нищо не остава в ObjectCache. Изглежда, че елементите се премахват от кеша, но не удрят обратното извикване. Възможно ли е това? Ако моите кеширани обекти се изчистват от GC, биха ли засегнали и обратното извикване?
Ето моята реализация:
private static readonly ObjectCache cache = MemoryCache.Default;
Елементите се добавят към кеша с помощта на:
public void AddToCache(String cacheKeyName, object cacheObject, int expiryMinutes)
{
callback = CachedObjectRemovedCallback;
// Sliding expiration
policy = new CacheItemPolicy
{
Priority = CacheItemPriority.Default,
SlidingExpiration = TimeSpan.FromMinutes(expiryMinutes),
RemovedCallback = callback
};
// Add to cache
cache.AddOrGetExisting(cacheKeyName, cacheObject, policy);
}
и премахнато обратно извикване:
private CacheEntryRemovedCallback callback;
private static void CachedObjectRemovedCallback(CacheEntryRemovedArguments arguments)
{
// Always check if the object is a customtype, and if so, release the session/license
if (arguments.CacheItem != null && IsCustomType(arguments.CacheItem.Value))
{
// Release the custom session
ICustomType customType= (ICustomType)arguments.CacheItem.Value;
customType.ReleaseSession();
}
}
UpdateCallback
, който трябва да бъде извикан точно преди записът да бъде премахнат? - person Michael Edenfield   schedule 28.12.2013if
някак си се проваля? - person Michael Edenfield   schedule 28.12.2013