From 5f1603fd35dc322a69f47c12460ea3c94d757c2e Mon Sep 17 00:00:00 2001 From: Blank Date: Tue, 13 Oct 2026 00:30:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(online):=20=E6=8B=86=E8=A7=A3=20CommitAsync?= =?UTF-8?q?=20=E9=99=8D=E4=BD=8E=E8=AE=A4=E7=9F=A5=E5=A4=8D=E6=9D=82?= =?UTF-8?q?=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 消除 SonarCloud S3776(CRITICAL):OnlineMatchmakerCoordinator.CommitAsync 认知复杂度 17 超阈值 15。拆出三个私有方法承载原内联段落:双 foreach 收集 (CollectTicketIdsAndPlayers)、assignment 事件发布 (PublishAssignmentCreatedAsync)、逐票据 ticket-changed 事件循环 (PublishMatchedTicketEventsAsync),主方法收敛后复杂度 1,拆出方法 3/3/10。纯等价重构:公共 API、事件 await 序与实参、return null 竞态 语义逐字不变。 Linear: GFX-891 --- .../OnlineMatchmakerCoordinator.cs | 53 +++++++++++++++---- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/GameFrameX.Online/Matchmaking/OnlineMatchmakerCoordinator.cs b/GameFrameX.Online/Matchmaking/OnlineMatchmakerCoordinator.cs index 0ad6f272..2c93ec51 100644 --- a/GameFrameX.Online/Matchmaking/OnlineMatchmakerCoordinator.cs +++ b/GameFrameX.Online/Matchmaking/OnlineMatchmakerCoordinator.cs @@ -154,14 +154,7 @@ private async Task CommitAsync(OnlineMatchTicket anchor, { var ticketIds = new List(group.Count); var players = new SortedSet(); - foreach (var ticket in group) - { - ticketIds.Add(ticket.TicketId); - foreach (var playerId in ticket.PlayerIds) - { - players.Add(playerId); - } - } + CollectTicketIdsAndPlayers(group, ticketIds, players); var assignment = new OnlineMatchAssignment { @@ -184,8 +177,50 @@ private async Task CommitAsync(OnlineMatchTicket anchor, return null; } + await PublishAssignmentCreatedAsync(committed, cancellationToken).ConfigureAwait(false); + + await PublishMatchedTicketEventsAsync(committed, ticketIds, cancellationToken).ConfigureAwait(false); + + return committed; + } + + /// + /// 累加成组票据的标识与成员(成员去重进有序集合,保证分配的玩家列表稳定有序)。 + /// + /// 成组票据。 + /// 票据标识输出(按组内顺序累加)。 + /// 玩家集合输出(去重累加)。 + private static void CollectTicketIdsAndPlayers(List group, List ticketIds, SortedSet players) + { + foreach (var ticket in group) + { + ticketIds.Add(ticket.TicketId); + foreach (var playerId in ticket.PlayerIds) + { + players.Add(playerId); + } + } + } + + /// + /// 发布对局分配创建事件(先于逐票据事件;空安全实参与既有口径逐字一致)。 + /// + /// 已落档的分配。 + /// 取消令牌。 + private async Task PublishAssignmentCreatedAsync(OnlineMatchAssignment committed, CancellationToken cancellationToken) + { await _eventPublisher.PublishAsync(OnlineMatchEvents.CreateAssignmentCreated(committed.TenantId, committed.AppId, committed.ServerId, committed.AssignmentId, committed.MatchId, committed.Mode, committed.Region, committed.PlayerIds == null ? 0 : committed.PlayerIds.Count, committed.PlayerIds != null && committed.PlayerIds.Count > 0 ? committed.PlayerIds[0] : 0, committed.TicketIds), cancellationToken).ConfigureAwait(false); + } + /// + /// 逐票据补发匹配态变更事件(按提交票据序 ,查得才发; + /// 竞态下票据缺失则静默跳过该张,与提交后重查口径一致)。 + /// + /// 已落档的分配。 + /// 本组票据标识。 + /// 取消令牌。 + private async Task PublishMatchedTicketEventsAsync(OnlineMatchAssignment committed, List ticketIds, CancellationToken cancellationToken) + { foreach (var ticketId in ticketIds) { var matched = await _store.FindAsync(committed.TenantId, committed.AppId, ticketId, cancellationToken).ConfigureAwait(false); @@ -194,8 +229,6 @@ private async Task CommitAsync(OnlineMatchTicket anchor, await _eventPublisher.PublishAsync(OnlineMatchEvents.CreateTicketChanged(matched.TenantId, matched.AppId, matched.ServerId, matched.TicketId, matched.PartyId, matched.FailureReason.ToString(), matched.AssignmentId, matched.PlayerIds == null ? 0 : matched.PlayerIds.Count, matched.PlayerIds != null && matched.PlayerIds.Count > 0 ? matched.PlayerIds[0] : 0, OnlineMatchTicketState.Queued.ToString(), OnlineMatchTicketState.Matched.ToString()), cancellationToken).ConfigureAwait(false); } } - - return committed; } ///