public override async Task OnDisconnectedAsync(Exception exception) { var cid = Context.ConnectionId; var user = _getLocalUser(cid); if (user == null) { await base.OnDisconnectedAsync(exception); return; } await _dbProvider.ContextActionAsync(async c => { var userId = user.UserId; var userList = _getLocalUserList(c, userId); if (userList == null || userList.Count == 0) { throw new NullReferenceException(nameof(userList)); } if (userList.Count == 1 && cid == userList[0].ConnectionId) { await _cleanDisconnectedUserData(userList[0], exception); _gameUserService.UpdateUserOnlineStatus(c, userId, false); return(true); } var orderedUserList = userList.OrderBy(i => i.DateJoin).ToList(); var last = orderedUserList.Last(); if (last.Connected && last.ConnectionId != cid) { foreach (var u in orderedUserList.Take(orderedUserList.Count - 1)) { await _cleanDisconnectedUserData(u, exception); } _gameUserService.UpdateUserOnlineStatus(c, userId, false); return(true); } foreach (var u in orderedUserList) { await _cleanDisconnectedUserData(u, exception); } _gameUserService.UpdateUserOnlineStatus(c, userId, false); return(true); }); }