コード例 #1
0
ファイル: UnregisterEvent.cs プロジェクト: Daoting/dt
        public async Task Handle(UnregisterEvent p_event)
        {
            var sc = new StringCache(p_event.CacheKey);
            var ci = Online.GetSession(p_event.UserID, p_event.SessionID);

            if (ci != null)
            {
                await sc.Set(null, "true");

                await ci.Close();
            }
            // 统计总数
            await sc.Increment("cnt");
        }
コード例 #2
0
ファイル: Pusher.cs プロジェクト: Daoting/dt
        /// <summary>
        /// 注销客户端
        /// 1. 早期版本在客户端关闭时会造成多个无关的ClientInfo收到Abort,只能从服务端Abort,升级到.net 5.0后不再出现该现象!!!
        /// 2. 使用客户端 response.Dispose() 主动关闭时,不同平台现象不同,服务端能同步收到uwp关闭消息,但android ios上不行,
        ///    直到再次推送时才发现客户端已关闭,为了保证客户端在线状态实时更新,客户端只能调用该方法!!!
        /// </summary>
        /// <param name="p_userID"></param>
        /// <param name="p_sessionID">会话标识,区分同一账号多个登录的情况</param>
        /// <returns></returns>
        public async Task <bool> Unregister(long p_userID, string p_sessionID)
        {
            var ci = Online.GetSession(p_userID, p_sessionID);

            if (ci != null)
            {
                await ci.Close();

                return(true);
            }

            // 查询所有其他副本
            int cnt = await Kit.GetSvcReplicaCount();

            if (cnt > 1)
            {
                string key = $"msg:Unregister:{p_userID}:{Guid.NewGuid().ToString().Substring(0, 6)}";
                Kit.RemoteMulticast(new UnregisterEvent {
                    CacheKey = key, UserID = p_userID, SessionID = p_sessionID
                });

                // 等待收集
                int total, retry = 0;
                var sc = new StringCache(key);
                do
                {
                    await Task.Delay(_delayMilli);

                    total = await sc.Get <int>("cnt");

                    retry++;
                }while (total < cnt && retry < _maxRetry);

                // 删除统计总数
                await sc.Delete("cnt");

                // 存在键值表示在线
                if (await sc.Delete(null))
                {
                    return(true);
                }
            }
            return(false);
        }