Esempio n. 1
0
		private object Add (string strKey,
			object objItem,
			CacheDependency objDependency,
			DateTime absolutExpiration,
			TimeSpan slidingExpiration,
			CacheItemPriority enumPriority,
			CacheItemRemovedCallback eventRemoveCallback,
			bool pub,
			bool overwrite) {

			if (strKey == null)
				throw new ArgumentNullException ("strKey");

			if (objItem == null)
				throw new ArgumentNullException ("objItem");

			if (slidingExpiration > _datetimeOneYear)
				throw new ArgumentOutOfRangeException ("slidingExpiration");

			CacheEntry objEntry;
			CacheEntry objOldEntry = null;

			long longHitRange = 10000;

			// todo: check decay and make up the minHit range

			objEntry = new CacheEntry (	this,
							strKey,
							objItem,
							objDependency,
							eventRemoveCallback,
							absolutExpiration,
							slidingExpiration,
							longHitRange,
							pub,
							enumPriority);

			_lockEntries.AcquireWriterLock (-1);
			try {
				_nItems++;
				if (_arrEntries.Contains (strKey)) {
					if (overwrite)
						objOldEntry = _arrEntries [strKey] as CacheEntry;
					else
						return null;
				}
				
				objEntry.Hit ();
				_arrEntries [strKey] = objEntry;

				// If we have any kind of expiration add into the CacheExpires
				// Do this under the lock so no-one can retrieve the objEntry
				// before it is fully initialized.
				if (objEntry.HasSlidingExpiration || objEntry.HasAbsoluteExpiration) {
					if (objEntry.HasSlidingExpiration)
						objEntry.Expires = DateTime.UtcNow.Ticks + objEntry.SlidingExpiration;

					_objExpires.Add (objEntry);
				}
			} finally {
				_lockEntries.ReleaseLock ();
			}

			if (objOldEntry != null) {
				if (objOldEntry.HasAbsoluteExpiration || objOldEntry.HasSlidingExpiration)
					_objExpires.Remove (objOldEntry);

				objOldEntry.Close (CacheItemRemovedReason.Removed);
			}

			return objEntry.Item;
		}