public void OnShow(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
 {
     expensiveObject    = "http://www.cnblogs.com/fish-li/";
     dependency         = null;
     absoluteExpiration = Cache.NoAbsoluteExpiration;
     slidingExpiration  = Cache.NoSlidingExpiration;
 }
        private void UpdateCallback(string key, CacheItemUpdateReason reason,
                                    out object value, out CacheDependency dependency,
                                    out DateTime absoluteexpiration, out TimeSpan slidingexpiration)
        {
            CacheEntry cacheEntry = null;

            // check if we should reload the data
            if (reason == CacheItemUpdateReason.Expired)
            {
                NotifyExpired(key);
                cacheEntry = LoadCacheEntry(key);
            }

            // check if we have a new cache entry
            if (cacheEntry != null)
            {
                value              = cacheEntry;
                dependency         = null;
                absoluteexpiration = CreateExpiresDate();
                slidingexpiration  = Cache.NoSlidingExpiration;
            }
            else
            {
                value              = null;
                dependency         = null;
                absoluteexpiration = Cache.NoAbsoluteExpiration;
                slidingexpiration  = Cache.NoSlidingExpiration;
            }
        }
Beispiel #3
0
        private static void HandleExpiration <T>(HttpCacheShim that
                                                 , CacheAddParameters <T> parameters
                                                 , string cacheKey
                                                 , CacheItemUpdateReason reason
                                                 , out object expensiveObject
                                                 , out CacheDependency dependency
                                                 , out DateTime absoluteExpiration
                                                 , out TimeSpan slidingExpiration)
            where T : class
        {
            Log("Expired", () => "(" + reason + ") " + cacheKey);

            expensiveObject    = null;
            dependency         = null;
            absoluteExpiration = Cache.NoAbsoluteExpiration;
            slidingExpiration  = Cache.NoSlidingExpiration;

            // if we were not shutting down, might want to handle the reuse/refresh
            if (reason == CacheItemUpdateReason.Expired &&
                !AppDomain.CurrentDomain.IsFinalizingForUnload())
            {
                if (parameters.ShouldScheduleRefresh &&
                    HttpCacheShim.DisableBackfill == false &&
                    !BackgroundQueue.IsBacklogged())
                {
                    // we need queue a request to the underlying store to get more current data into the cache so it stays primed.
                    BackgroundQueue.Enqueue(parameters);
                }
            }
        }
Beispiel #4
0
 /// <summary>
 /// 更新缓存回调函数
 /// </summary>
 /// <param name="key">键</param>
 /// <param name="value">值</param>
 /// <param name="reason">更新缓存的原因</param>
 public void onUpdatedCallback(string key, object value, CacheItemUpdateReason reason)
 {
     if (reason == CacheItemUpdateReason.DependencyChanged)
     {
     }
     //Response.Write("文件变了,快去看看");
 }
Beispiel #5
0
    public static void RunOptionsUpdateCallback(
        string key, CacheItemUpdateReason reason,
        out object expensiveObject,
        out CacheDependency dependency,
        out DateTime absoluteExpiration,
        out TimeSpan slidingExpiration)
    {
        // 注意哦:在这个方法中,不要出现【未处理异常】,否则缓存对象将被移除。

        // 说明:这里我并不关心参数reason,因为我根本就没有使用过期时间
        //        所以,只有一种原因:依赖的文件发生了改变。
        //        参数key我也不关心,因为这个方法是【专用】的。

        string file = Path.Combine(AppDataPath, _fileName);

        if (File.Exists(file))
        {
            expensiveObject = _cacheNumber++;
            dependency      = new CacheDependency(Path.Combine(AppDataPath, _fileName));
        }
        else
        {
            expensiveObject = _cacheNumber++;
            dependency      = new CacheDependency(Path.Combine(AppDataPath, _fileName));
            HttpRuntime.Cache.Remove(key);
        }

        absoluteExpiration = Cache.NoAbsoluteExpiration;
        slidingExpiration  = Cache.NoSlidingExpiration;

        //// 检验代码是否被同一个修改文件的事件执行了二次,【注意目录是我机器上的】
        //System.IO.File.WriteAllText("c:\\Temp\\" + Guid.NewGuid().ToString() + ".txt", key);
        // 由于事件发生时,文件可能还没有完全关闭,所以只好让程序稍等。
        System.Threading.Thread.Sleep(50);
    }
Beispiel #6
0
        /// <summary>
        /// 当记录点赞数失效后,执行本函数
        /// </summary>
        /// <param name="key"></param>
        /// <param name="reason"></param>
        /// <param name="expensiveObject"></param>
        /// <param name="dependency"></param>
        /// <param name="absoluteExpiration"></param>
        /// <param name="slidingExporation"></param>
        public void MyCacheUpdataCallback(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExporation)
        {
            try
            {
                //根据Key 取得Id然后取得缓存值,即为点赞数,并记录到数据库中
                string idstr = key.Substring(key.LastIndexOf("_", key.Length - key.LastIndexOf("_") + 1));
                int    id    = Convert.ToInt32(idstr);

                //得到缓存
                var value   = HttpRuntime.Cache.Get(key);
                var article = blogsdbContext.article.Where(m => m.ID == id).First();
                article.UP = Convert.ToInt32(value);
                blogsdbContext.SaveChanges();

                expensiveObject = value;

                HttpRuntime.Cache.Remove(key);
            }
            catch (Exception)
            {
                expensiveObject = DateTime.Now.ToString();
            }
            dependency         = null;
            absoluteExpiration = DateTime.UtcNow.AddSeconds(-1);
            slidingExporation  = Cache.NoSlidingExpiration;
        }
Beispiel #7
0
        bool NeedsUpdate(CacheItem item, CacheItemUpdateReason reason, bool needLock)
        {
            try {
                if (needLock)
                {
                    cacheLock.EnterWriteLock();
                }

                if (item == null || item.OnUpdateCallback == null)
                {
                    return(false);
                }

                object                  expensiveObject;
                CacheDependency         dependency;
                DateTime                absoluteExpiration;
                TimeSpan                slidingExpiration;
                string                  key      = item.Key;
                CacheItemUpdateCallback updateCB = item.OnUpdateCallback;

                updateCB(key, reason, out expensiveObject, out dependency, out absoluteExpiration, out slidingExpiration);
                if (expensiveObject == null)
                {
                    return(false);
                }

                CacheItemPriority        priority = item.Priority;
                CacheItemRemovedCallback removeCB = item.OnRemoveCallback;
                CacheItemRemovedReason   whyRemoved;

                switch (reason)
                {
                case CacheItemUpdateReason.Expired:
                    whyRemoved = CacheItemRemovedReason.Expired;
                    break;

                case CacheItemUpdateReason.DependencyChanged:
                    whyRemoved = CacheItemRemovedReason.DependencyChanged;
                    break;

                default:
                    whyRemoved = CacheItemRemovedReason.Removed;
                    break;
                }

                Remove(key, whyRemoved, false, false);
                Insert(key, expensiveObject, dependency, absoluteExpiration, slidingExpiration, priority, removeCB, updateCB, false);

                return(true);
            } catch (Exception) {
                return(false);
            } finally {
                if (needLock)
                {
                    // See comment at the top of the file, above cacheLock declaration
                    cacheLock.ExitWriteLock();
                }
            }
        }
 private void Callback(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
 {
     expensiveObject    = null;
     dependency         = null;
     absoluteExpiration = Cache.NoAbsoluteExpiration;
     slidingExpiration  = Cache.NoSlidingExpiration;
     Console.WriteLine("{0} key expired", key);
 }
Beispiel #9
0
 /// <summary>
 /// 缓存改变回调函数
 /// 目的是当接口文档.XML文件发生改变的时候,重新加载接口文档定义。通常发生在接口更新的时候
 /// </summary>
 /// <param name="key"></param>
 /// <param name="reason"></param>
 /// <param name="expensiveObject"></param>
 /// <param name="dependency"></param>
 /// <param name="absoluteExpiration"></param>
 /// <param name="slidingExpiration"></param>
 private void CacheItemUpdateCallback(string key, CacheItemUpdateReason reason, out Object expensiveObject,
                                      out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
 {
     expensiveObject    = GetApiList();
     absoluteExpiration = Cache.NoAbsoluteExpiration;
     dependency         = new CacheDependency(_FullConfigName);
     slidingExpiration  = TimeSpan.FromHours(1.0);
 }
        private void HandleUpdateNotification(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, 
            out DateTime absoluteExpiration, out TimeSpan slidingExpiration) {
            System.Diagnostics.Debug.WriteLine("Item {0} removed ({1})", key, Enum.GetName(typeof(CacheItemUpdateReason), reason));
            expensiveObject = dependency = new SelfExpiringData<long?>(GetData(false).Result, 3);

            absoluteExpiration = Cache.NoAbsoluteExpiration;
            slidingExpiration = Cache.NoSlidingExpiration;
            
        }
Beispiel #11
0
        private static void CacheUpdateCallback(string key, CacheItemUpdateReason callbackreason, out object value, out CacheDependency dependency, out DateTime expiration, out TimeSpan slidingExpiration)
        {
            Uri xmlPath = GetUriXmlPath(@"StoredProcedures.xml");

            dependency        = new CacheDependency(xmlPath.LocalPath);
            expiration        = Cache.NoAbsoluteExpiration;
            slidingExpiration = Cache.NoSlidingExpiration;
            value             = LoadStoredProcedureCache();
        }
Beispiel #12
0
        private static void CacheUpdateCallback(string key, CacheItemUpdateReason callbackreason, out object value, out CacheDependency dependency, out DateTime expiration, out TimeSpan slidingExpiration)
        {
            string sXMLPath = Path.Combine(Utility.ComponentBaseFolder + "\\Xml", ComponentTypeName + ".xml");

            dependency        = new CacheDependency(sXMLPath);
            expiration        = Cache.NoAbsoluteExpiration;
            slidingExpiration = Cache.NoSlidingExpiration;
            value             = LoadComponentXMLCache();
        }
Beispiel #13
0
 public static void ASPCacheRemoveCallBack(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
 {
     expensiveObject    = null;
     dependency         = null;
     absoluteExpiration = DateTime.Now;
     slidingExpiration  = TimeSpan.Zero;
     CompanyPay.LogHelper.WriteLine("Key:" + key + "被删除,原因:" + reason + ",时间:" + DateTime.Now.ToString()
                                    + "可用数:" + HttpRuntime.Cache.EffectivePrivateBytesLimit);
 }
        private static void OnCacheEntryExpired(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
        {
            expensiveObject    = null;
            dependency         = null;
            absoluteExpiration = Cache.NoAbsoluteExpiration;
            slidingExpiration  = Cache.NoSlidingExpiration;
            CachedAttachmentInfo cachedAttachmentInfo = (CachedAttachmentInfo)HttpRuntime.Cache.Get(key);

            if (cachedAttachmentInfo.CobaltStore == null)
            {
                return;
            }
            WacRequestHandler.OnCacheEntryExpired(cachedAttachmentInfo);
        }
Beispiel #15
0
        private void RunOptionsUpdateCallback(
            string key, CacheItemUpdateReason reason,
            out object expensiveObject,
            out CacheDependency dependency,
            out DateTime absoluteExpiration,
            out TimeSpan slidingExpiration)
        {
            expensiveObject    = "c001" + DateTime.Now.ToString("yyyyMMddHHmmss");
            dependency         = new CacheDependency(path);
            absoluteExpiration = Cache.NoAbsoluteExpiration;
            slidingExpiration  = Cache.NoSlidingExpiration;

            Load();
        }
Beispiel #16
0
        private void HandleNotification(string key,
                                        CacheItemUpdateReason reason,
                                        out object data,
                                        out CacheDependency dependency,
                                        out DateTime absoluteExpiry,
                                        out TimeSpan slidingExpiry)
        {
            System.Diagnostics.Debug.WriteLine("Item {0} removed. ({1})", key, Enum.GetName(typeof(CacheItemRemovedReason), reason));

            data = dependency =
                new SelfExpiringData <long?>(GetData(false).Result, 3);

            slidingExpiry  = Cache.NoSlidingExpiration;
            absoluteExpiry = Cache.NoAbsoluteExpiration;
        }
Beispiel #17
0
        public void HandleUpdteCallback(String key, CacheItemUpdateReason reason, out Object data, out CacheDependency dependency,
                                        out DateTime absExpiry, out TimeSpan slidingExpiry)
        {
            Boolean renew = accessedCounter >= renewTheshold;

            if (renew)
            {
                dataObject      = updateCallback();
                accessedCounter = 0;
            }
            data          = renew ? this : null;
            dependency    = null;
            slidingExpiry = Cache.NoSlidingExpiration;
            absExpiry     = renew ? Expiry : Cache.NoAbsoluteExpiration;
        }
Beispiel #18
0
 private static void DMCacheItemUpdateCallback(
     string key,
     CacheItemUpdateReason reason,
     out object expensiveObject,
     out CacheDependency dependency,
     out DateTime absoluteExpiration,
     out TimeSpan slidingExpiration
     )
 {
     //Debug.Print(string.Format("###: key={0} reason={1}, time={2}", key, reason, DateTime.Now));
     expensiveObject    = null;
     dependency         = null;
     absoluteExpiration = Cache.NoAbsoluteExpiration;
     slidingExpiration  = Cache.NoSlidingExpiration;
 }
        private static void OnCacheItemRemoved(string key, CacheItemUpdateReason reason, out object obj, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
        {
            var uploadSession = GetSession(key);
            
            CoreContext.TenantManager.SetCurrentTenant(uploadSession.TenantId);
            
            using (var dao = Global.DaoFactory.GetFileDao())
            {
                dao.AbortUploadSession(uploadSession);
            }

            obj = null;
            dependency = null;
            absoluteExpiration = AbsoluteExpiration;
            slidingExpiration = SlidingExpiration;
        }
        private static void OnCacheItemRemoved(string key, CacheItemUpdateReason reason, out object obj, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
        {
            var uploadSession = GetSession(key);

            CoreContext.TenantManager.SetCurrentTenant(uploadSession.TenantId);

            using (var dao = Global.DaoFactory.GetFileDao())
            {
                dao.AbortUploadSession(uploadSession);
            }

            obj                = null;
            dependency         = null;
            absoluteExpiration = AbsoluteExpiration;
            slidingExpiration  = SlidingExpiration;
        }
        private void HandleUpdateCallback(string key, CacheItemUpdateReason reason, out object data,
                                          out CacheDependency dependency, out DateTime absExpiry, out TimeSpan slidingExpiry)
        {
            bool renew = _accessedCounter >= _renewThreshold;

            if (renew)
            {
                _dataObject      = _updateCallback();
                _accessedCounter = 0;
            }

            data          = renew ? this : null;
            dependency    = null;
            slidingExpiry = Cache.NoSlidingExpiration;
            absExpiry     = renew ? Expiry : Cache.NoAbsoluteExpiration;
        }
Beispiel #22
0
        private void HandleUpdateCallback(string key, CacheItemUpdateReason reason,
                                          out object expensiveObject, out CacheDependency dependency,
                                          out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
        {
            bool renew = accessedCounter >= renewThreshold;

            if (renew)
            {
                dataObject      = updateCallback();
                accessedCounter = 0;
            }

            expensiveObject    = renew ? this : null;
            dependency         = null;
            absoluteExpiration = renew ? Expiry : Cache.NoAbsoluteExpiration;
            slidingExpiration  = Cache.NoSlidingExpiration;
        }
Beispiel #23
0
 /// <summary>
 /// 缓存删除之前调用方法
 /// </summary>
 /// <param name="key"></param>
 /// <param name="reason"></param>
 /// <param name="expensiveObject"></param>
 /// <param name="dependency"></param>
 /// <param name="absoluteExpiration"></param>
 /// <param name="slidingExpiration"></param>
 public void UpdateCallback(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
 {
     // key:要从缓存中移除的项的标识符。
     // reason:要从缓存中移除项的原因。
     // expensiveObject:此方法返回时,包含含有更新的缓存项对象。
     // dependency:此方法返回时,包含定义项对象和文件、缓存键、文件或缓存键的数组或另一个 System.Web.Caching.CacheDependency 对象之间的依赖项的对象。
     // absoluteExpiration:此方法返回时,包含对象的到期时间。
     // slidingExpiration:此方法返回时,包含对象的上次访问时间和对象的到期时间之间的时间间隔。
     expensiveObject    = null;
     dependency         = null;
     absoluteExpiration = DateTime.Now;
     slidingExpiration  = TimeSpan.Zero;
     Console.WriteLine("缓存马上被移除!");
     //但是现在还有没有呢?输出试试
     Console.WriteLine(HttpRuntime.Cache["DD"]);
     Console.WriteLine(reason.ToString());
 }
Beispiel #24
0
        public void RunOptionsUpdateCallback(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
        {
            // 注意哦:在这个方法中,不要出现【未处理异常】,否则缓存对象将被移除。

            // 说明:这里并不关心参数reason,因为我根本就没有使用过期时间  所以,只有一种原因:依赖的文件发生了改变。

            expensiveObject = CacheDependencyValueObj;
            dependency = new CacheDependency(Path.Combine(Global.App_DataDir, fileName));
            absoluteExpiration = Cache.NoAbsoluteExpiration;
            slidingExpiration = Cache.NoSlidingExpiration;

            // 由于事件发生时,文件可能还没有完全关闭,所以只好让程序稍等。
            System.Threading.Thread.Sleep(50);

            // 重新加载配置参数
            _options = LoadRunOptions();
        }
Beispiel #25
0
 private void CacheItemUpdateCallback(string key, CacheItemUpdateReason reason, out Object expensiveObject,
                                      out CacheDependency dependency, out DateTime absoluteExpiration,
                                      out TimeSpan slidingExpiration)
 {
     expensiveObject    = new object();
     dependency         = new SqlCacheDependency(_connectionStringKey, TableName);
     absoluteExpiration = Cache.NoAbsoluteExpiration;
     slidingExpiration  = Cache.NoSlidingExpiration;
     try
     {
         InitCacheList();
         IdentifyChanges();
     }
     catch (Exception ex)
     {
         var logger = Container.Instance.Resolve <IExceptionLogger>();
         logger.LogException(ex, "CACHE DEPENDENCY FAILED ON UPDATE CALLBACK");
     }
 }
Beispiel #26
0
        private static void UploadSettingsUpdateCallback(
            string key, CacheItemUpdateReason reason,
            out object expensiveObject,
            out CacheDependency dependency,
            out DateTime absoluteExpiration,
            out TimeSpan slidingExpiration)
        {
            // 注意哦:在这个方法中,不要出现【未处理异常】,否则缓存对象将被移除。

            // 说明:这里我并不关心参数reason,因为我根本就没有使用过期时间
            //        所以,只有一种原因:依赖的文件发生了改变。
            //        参数key我也不关心,因为这个方法是【专用】的。

            expensiveObject    = "yxl";
            dependency         = new CacheDependency(GetSettingsFilePath());
            absoluteExpiration = Cache.NoAbsoluteExpiration;
            slidingExpiration  = Cache.NoSlidingExpiration;

            // 重新加载配置参数
            Init();
        }
Beispiel #27
0
        private static void RefetchItem(string key, CacheItemUpdateReason reason, out object value, out CacheDependency dependency, out DateTime exipriation, out TimeSpan slidingExpiration)
        {
            var meta         = _meta[key];
            int refreshLimit = meta.Item3;
            int refreshCount = meta.Item4 + 1;

            if (refreshLimit == 0 || refreshCount <= refreshLimit)
            {
                Debug.Print(String.Format("Refreshing cache: {0} - #{1}", key, refreshCount));
                _meta[key] = new Tuple <Func <object>, TimeSpan, int, int>(meta.Item1, meta.Item2, meta.Item3, refreshCount);

                //reset into cache dummy object to get callback
                value             = new object();
                dependency        = null;
                exipriation       = DateTime.Now.Add(meta.Item2);
                slidingExpiration = Cache.NoSlidingExpiration;

                try
                {
                    var data = meta.Item1(); //get new data
                    _cache[key] = data;
                }
                catch (Exception ex)
                {
                    Debug.Print(ex.ToString());
                    /*no-op*/
                }
            }
            else
            {
                Debug.Print(String.Format("Expiring cache: {0} - #{1}", key, refreshCount));

                //expire cache
                value             = null;
                dependency        = null;
                exipriation       = Cache.NoAbsoluteExpiration;
                slidingExpiration = Cache.NoSlidingExpiration;
                Remove(key);
            }
        }
        public static void PetLinkListCacheItemUpdateCallbackMethod(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
        {
            // Step 0.
            expensiveObject    = null;
            dependency         = null;
            absoluteExpiration = DateTime.Now.AddSeconds(GetPetLinkListExpirationInSeconds());
            slidingExpiration  = Cache.NoSlidingExpiration;

            if (DateTime.Now.Minute % 10 == 0)
            {
                return; // do nothing
            }

            // Step 1. Parse Key
            Guid?providerGroupId = GetPetLinkListCacheKeyProviderGroupId(key);

            if (providerGroupId != null)
            {
                expensiveObject = new GetPetLinkList()
                {
                    ProviderGroupId = providerGroupId.Value
                }.ExecuteList();
            }
        }
Beispiel #29
0
 /// <summary>
 /// 更新缓存回调函数
 /// </summary>
 /// <param name="key">键</param>
 /// <param name="value">值</param>
 /// <param name="reason">更新缓存的原因</param>
 public void onUpdatedCallback(string key, object value, CacheItemUpdateReason reason)
 {
     if (reason == CacheItemUpdateReason.DependencyChanged) { }
     //Response.Write("文件变了,快去看看");
 }
 private void Callback(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration) {
     expensiveObject = null;
     dependency = null;
     absoluteExpiration = Cache.NoAbsoluteExpiration;
     slidingExpiration = Cache.NoSlidingExpiration;
     Console.WriteLine("{0} key expired", key);
 }
Beispiel #31
0
        private static void OnCacheItemExpired(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration)
        {
            log.DebugFormat("Cache item '{0}' expired, reason: {1}.", key, reason);

            expensiveObject = null;
            dependency = null;
            absoluteExpiration = Cache.NoAbsoluteExpiration;
            slidingExpiration = Cache.NoSlidingExpiration;
        }
Beispiel #32
0
		bool NeedsUpdate (CacheItem item, CacheItemUpdateReason reason, bool needLock)
		{
			try {
				if (needLock)
					cacheLock.EnterWriteLock ();
				
				if (item == null || item.OnUpdateCallback == null)
					return false;

				object expensiveObject;
				CacheDependency dependency;
				DateTime absoluteExpiration;
				TimeSpan slidingExpiration;
				string key = item.Key;
				CacheItemUpdateCallback updateCB = item.OnUpdateCallback;
				
				updateCB (key, reason, out expensiveObject, out dependency, out absoluteExpiration, out slidingExpiration);
				if (expensiveObject == null)
					return false;

				CacheItemPriority priority = item.Priority;
				CacheItemRemovedCallback removeCB = item.OnRemoveCallback;
				CacheItemRemovedReason whyRemoved;

				switch (reason) {
					case CacheItemUpdateReason.Expired:
						whyRemoved = CacheItemRemovedReason.Expired;
						break;

					case CacheItemUpdateReason.DependencyChanged:
						whyRemoved = CacheItemRemovedReason.DependencyChanged;
						break;

					default:
						whyRemoved = CacheItemRemovedReason.Removed;
						break;
				}
				
				Remove (key, whyRemoved, false, false);
				Insert (key, expensiveObject, dependency, absoluteExpiration, slidingExpiration, priority, removeCB, updateCB, false);
				
				return true;
			} catch (Exception) {
				return false;
			} finally {
				if (needLock) {
					// See comment at the top of the file, above cacheLock declaration
					cacheLock.ExitWriteLock ();
				}
			}
		}