コード例 #1
0
            /// <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());
            }
コード例 #2
0
                /// <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());
                }
コード例 #3
0
                /// <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();
                }