System.Web.SessionState.SessionInProcHandler.SetAndReleaseItemExclusive C# (CSharp) Method

SetAndReleaseItemExclusive() public method

public SetAndReleaseItemExclusive ( HttpContext context, string id, System.Web.SessionState.SessionStateStoreData item, object lockId, bool newItem ) : void
context HttpContext
id string
item System.Web.SessionState.SessionStateStoreData
lockId object
newItem bool
return void
		public override void SetAndReleaseItemExclusive (HttpContext context,
								 string id,
								 SessionStateStoreData item,
								 object lockId,
								 bool newItem)
		{
			EnsureGoodId (id, true);
			string CacheId = CachePrefix + id;
			Cache cache = HttpRuntime.InternalCache;
			InProcSessionItem inProcItem = cache [CacheId] as InProcSessionItem;
			ISessionStateItemCollection itemItems = null;
			int itemTimeout = 20;
			HttpStaticObjectsCollection itemStaticItems = null;

			if (item != null) {
				itemItems = item.Items;
				itemTimeout = item.Timeout;
				itemStaticItems = item.StaticObjects;
			}
			
			if (newItem || inProcItem == null) {
				inProcItem = new InProcSessionItem ();
				inProcItem.timeout = itemTimeout;
				inProcItem.expiresAt = DateTime.UtcNow.AddMinutes (itemTimeout);
				if (lockId.GetType() == typeof(Int32))
					inProcItem.lockId = (Int32)lockId;
			} else {
				if (lockId == null || lockId.GetType() != typeof(Int32) || inProcItem.lockId != (Int32)lockId)
					return;
				inProcItem.resettingTimeout = true;
				cache.Remove (CacheId);
			}

			bool locked = false;
			try {
				if (inProcItem.rwlock.TryEnterWriteLock (lockAcquireTimeout))
					locked = true;
				else
					throw new ApplicationException ("Failed to acquire lock");
				inProcItem.locked = false;
				inProcItem.items = itemItems;
				inProcItem.staticItems = itemStaticItems;
				InsertSessionItem (inProcItem, itemTimeout, CacheId);
			} catch {
				throw;
			} finally {
				if (locked)
					inProcItem.rwlock.ExitWriteLock ();
			}
		}