C# 未调用ObjectCache CachedObjectRemovedCallback吗?
我有一个WCF服务,它正在实现一个自定义ObjectCache来缓存第三方COM对象,以便与3270环境接口 此第三方对象在许可模型上工作,因此每次从缓存中删除对象时都必须调用my RemovedCallBack以释放许可证 我的问题是,我一直在使用许可证,但ObjectCache中没有任何内容。这似乎是从缓存中删除了项,但没有命中回调。这可能吗?如果我的缓存对象正在被GC清理,它们还会命中回调吗 以下是我的实现:C# 未调用ObjectCache CachedObjectRemovedCallback吗?,c#,wcf,caching,memorycache,objectcache,C#,Wcf,Caching,Memorycache,Objectcache,我有一个WCF服务,它正在实现一个自定义ObjectCache来缓存第三方COM对象,以便与3270环境接口 此第三方对象在许可模型上工作,因此每次从缓存中删除对象时都必须调用my RemovedCallBack以释放许可证 我的问题是,我一直在使用许可证,但ObjectCache中没有任何内容。这似乎是从缓存中删除了项,但没有命中回调。这可能吗?如果我的缓存对象正在被GC清理,它们还会命中回调吗 以下是我的实现: private static readonly ObjectCache cach
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();
}
}
我认为解决这个问题的一个更好的方法是完全避免删除回调,并使用一个自定义类包装COM对象,该类有一个终结器来执行ReleaseSession()调用。不过,更好的做法是为COM对象实现某种对象池 在您当前的实现中(使用已删除的回调函数),有人可以将对象从缓存中取出,在处理完之前,缓存决定修剪,从缓存中删除相同的对象
从终结器线程执行COM调用有一些危险(例如,如果STA线程没有泵送,STA对象可能会阻止终结器),但不会比您当前的实现更糟。您是否确认没有调用回调,或者你只是猜测?我在回调中实现了日志记录,并且正在获取日志条目,但我只是猜测其中一些没有被调用。另外,你是否尝试过
UpdateCallback
,它应该在删除条目之前被调用?我正在查看UpdateCallback,但我不确定这对我有多大帮助,除非我遇到了某种竞争条件。是否有可能你的回调被调用了,但你的if
语句以某种方式失败了?