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