/// <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 { } } }
/// <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); }