Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未调用ObjectCache CachedObjectRemovedCallback吗?_C#_Wcf_Caching_Memorycache_Objectcache - Fatal编程技术网

C# 未调用ObjectCache CachedObjectRemovedCallback吗?

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

我有一个WCF服务,它正在实现一个自定义ObjectCache来缓存第三方COM对象,以便与3270环境接口

此第三方对象在许可模型上工作,因此每次从缓存中删除对象时都必须调用my 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();
            }
        }

我认为解决这个问题的一个更好的方法是完全避免删除回调,并使用一个自定义类包装COM对象,该类有一个终结器来执行ReleaseSession()调用。不过,更好的做法是为COM对象实现某种对象池

在您当前的实现中(使用已删除的回调函数),有人可以将对象从缓存中取出,在处理完之前,缓存决定修剪,从缓存中删除相同的对象


从终结器线程执行COM调用有一些危险(例如,如果STA线程没有泵送,STA对象可能会阻止终结器),但不会比您当前的实现更糟。

您是否确认没有调用回调,或者你只是猜测?我在回调中实现了日志记录,并且正在获取日志条目,但我只是猜测其中一些没有被调用。另外,你是否尝试过
UpdateCallback
,它应该在删除条目之前被调用?我正在查看UpdateCallback,但我不确定这对我有多大帮助,除非我遇到了某种竞争条件。是否有可能你的回调被调用了,但你的
if
语句以某种方式失败了?