Пример #1
0
 /// <summary>
 /// 长轮询推送
 /// </summary>
 /// <param name="onPolls">长轮询委托集合</param>
 /// <param name="message">长轮询消息</param>
 private static void poll(list <Action <poll.message> > onPolls, poll.message message)
 {
     foreach (Action <poll.message> onPoll in onPolls)
     {
         try
         {
             onPoll(message);
         }
         catch { }
     }
 }
Пример #2
0
        /// <summary>
        /// 长轮询回调注册
        /// </summary>
        /// <param name="user">登录用户</param>
        /// <param name="version">登录用户版本信息</param>
        /// <param name="onPoll">长轮询回调委托</param>
        /// <returns>长轮询消息</returns>
        public static poll.message GetMessage(string user, int version, Action <poll.message> onPoll)
        {
            poll.message          message   = null;
            Action <poll.message> oldOnPoll = null;
            userInfo   userInfo             = null;
            hashString userHash             = user;
            bool       isTimeout            = false;

            Monitor.Enter(userLock);
            try
            {
                if (userInfos.TryGetValue(userHash, out userInfo))
                {
                    userInfo.LastTime = date.NowSecond;
                    if (version == userVersion)
                    {
                        oldOnPoll = userInfo.OnPoll;
                        if (userInfo.Messages.Count == 0)
                        {
                            userInfo.PollTimeout = date.NowSecond.AddSeconds(60);
                            userInfo.OnPoll      = onPoll;
                            isTimeout            = true;
                        }
                        else
                        {
                            message = new poll.message {
                                Messages = userInfo.Messages.GetArray()
                            };
                            userInfo.Messages.Clear();
                        }
                    }
                    else
                    {
                        message = new poll.message {
                            UserVersion = userVersion, Users = userInfos.Keys.getArray(value => value.ToString())
                        }
                    };
                }
                else
                {
                    message = chatWeb.poll.message.Null;
                }
            }
            finally { Monitor.Exit(userLock); }
            if (oldOnPoll != null)
            {
                oldOnPoll(null);
            }
            if (isTimeout)
            {
                threading.timerTask.Default.Add(pollTimeout, userInfo, userInfo.PollTimeout, null);
            }
            return(message);
        }