我已经在AppFabric上启用了通知,并且我试图在添加期间指定的超时后从缓存中删除项目时收到通知。 例如:
TimeSpan timeout = new TimeSpan(0,0,10);
m_cache.Add(OrderId.Text, order, timeout);
m_cache.AddItemLevelCallback(OrderId.Text,DataCacheOperations.RemoveItem,myCacheLvlDelegate);
我在“myCacheLvlDelegate”方法中放置了一个断点,但即使在10s超时(测试)之后也永远不会到达。 出于测试目的,我已明确调用
m_cache.Remove(OrderId.Text);
然后调用代表!
所以只有在我明确调用Remove函数时才调用delegate方法,但是如果超时到期则不会调用...
您是否有解决方案在超时后(在添加期间指定的那个)获得通知?
我需要它,因为我想在超时后调用web服务来刷新数据并再次缓存结果。
谢谢,
和Fabrice
答案 0 :(得分:1)
您真正需要的是在特定时间间隔提醒以刷新Appfabric缓存项目。
您可以尝试将AppFabric缓存与Microsoft Enterprise Library中的缓存块结合使用。缓存块使您能够在项目即将到期时收到通知。这虽然会创建两个缓存。
将对象标识符存储在应用程序块提供的缓存中,并具有必要的超时间隔,而您可以在没有超时间隔的情况下将实际数据“放入”AppFabric缓存中。使用“Put”而不是“Add”来确保替换对象(如果存在),否则创建它。
答案 1 :(得分:0)
我认为你无法做到这一点,因为我认为回调机制并不是这样设计的。我可以看到你想要实现的目标,我可以看到你是如何得出这个问题的,但我认为只要你的客户端在任何地方使用缓存模式,你就会触及缓存,你会得到影响。
要进行审核,缓存旁边模式为:
e.g。
Order order;
// Check to see if the order is in the cache
Object cachedOrder = m_cache.Get(OrderId.Text);
if (cachedOrder == null)
{
// The order is NOT in the cache, so get it from the web service
order = OrderWebservice.Get(OrderId.Text);
// Cache the order for 10 seconds
m_cache.Add(OrderId.Text, order, New TimeSpan(0,0,10);
}
else
{
// The order IS in the cache, so cast it
order = (Order)cachedOrder;
}
// Return the order to the client, whether it's the cached order or the one from the web service
return order;
这样,缓存的顺序永远不会超过10秒,因为如果它超出缓存,下一个调用者将从缓存中获得null结果并再次调用Web服务以从中获取订单网络服务。您将获得相同的效果,但由于缓存将按需填充,您应该会看到对服务器的影响较小,因为它不会每十秒钟启动一次Web服务请求。
答案 2 :(得分:0)
如果问题含义很深,我现在不知道,但如果某个项目在appfabric中过期,则通知将在过期后被检索。即使它是项目级别的回调或缓存级别回调。
我的代码是
CustomDataCacheOperations.InsertIntoCache(myTestCache, txtKey.Text, InputTable.Text, 10);
ndCacheLvlAllOps = myTestCache.AddItemLevelCallback(txtKey.Text, allCacheOperations, myCacheLvlDelegate);
插入方法是
public static void InsertIntoCache(DataCache curCache, string Key, object value,int timeoutInSeconds)
{
if (curCache.Get(Key) == null)
curCache.Add(Key, value,new TimeSpan(0,0,timeoutInSeconds));
else
curCache.Put(Key, value, new TimeSpan(0, 0, timeoutInSeconds));
}
它正在为所有操作提供通知。到期通知将在项目从内存中逐出而不是TTL(生存时间)结束后才会到来。我已经从微软证实了这一点。你应该稍等一下才能收到通知。