/// <summary> /// 添加用户长连接轮询验证 /// </summary> /// <param name="userId"></param> /// <returns></returns> public string Add(int userId) { sessionId sessionId; int index = userId >> 8; if (index < sessions.Length) { Monitor.Enter(sessionLock); sessionId = sessions[index].Timeout > date.NowSecond ? sessions[index].SessionId : sessions[index].New(date.NowSecond.AddTicks(timeoutTicks)); Monitor.Exit(sessionLock); } else { Monitor.Enter(sessionLock); if (index < sessions.Length) { sessionId = sessions[index].Timeout > date.NowSecond ? sessions[index].SessionId : sessions[index].New(date.NowSecond.AddTicks(timeoutTicks)); Monitor.Exit(sessionLock); } else { try { sessionTimeout[] newSessions = new sessionTimeout[Math.Max(sessions.Length << 1, index + 256)]; sessions.CopyTo(newSessions, 0); sessions = newSessions; sessionId = newSessions[index].New(date.NowSecond.AddTicks(timeoutTicks)); } finally { Monitor.Exit(sessionLock); } } } return(sessionId.ToHexString()); }
/// <summary> /// 添加用户长连接轮询验证 /// </summary> /// <param name="userId"></param> /// <returns></returns> public string Add(int userId) { sessionTimeout value; if (!sessions.TryGetValue(userId, out value)) { sessionId sessionId = default(sessionId); sessionId.New(); Monitor.Enter(sessionLock); try { if (!sessions.ContainsKey(userId)) { sessions.Add(userId, value = new sessionTimeout { SessionId = sessionId, Timeout = date.NowSecond.AddTicks(timeoutTicks) }); } } finally { Monitor.Exit(sessionLock); } } return(value.SessionId.ToHexString()); }
/// <summary> /// 获取用户长连接轮询验证 /// </summary> /// <param name="userId">用户标识</param> /// <param name="sessionId">长连接轮询验证,0表示失败</param> public void Get(int userId, ref sessionId sessionId) { sessionTimeout value; if (sessions.TryGetValue(userId, out value)) { if (value.Timeout > date.NowSecond) { sessionId = value.SessionId; return; } sessionId.New(); Monitor.Enter(sessionLock); try { sessions[userId] = new sessionTimeout { SessionId = sessionId, Timeout = date.NowSecond.AddTicks(timeoutTicks) }; } finally { Monitor.Exit(sessionLock); } return; } sessionId.Null(); }