public async override Task <LeafNode> BestNodeAsync(Tournament <T> tournament, IAsyncComparator <T> comparator, CancellationToken cancellationToken) { if (BestCompetitor == null) { Debug.Assert(tournament.NextWinnerStepsMax > 0); Debug.Assert(tournament.NextWinnerStepsMax - tournament.NextWinnerStepsDone > 0); cancellationToken.ThrowIfCancellationRequested(); T itemA = (await CompetitorA.BestNodeAsync(tournament, comparator, cancellationToken)).Item; cancellationToken.ThrowIfCancellationRequested(); T itemB = (await CompetitorB.BestNodeAsync(tournament, comparator, cancellationToken)).Item; cancellationToken.ThrowIfCancellationRequested(); BestCompetitor = (await comparator.CompareAsync(itemA, itemB, cancellationToken)) > 0 ? CompetitorA : CompetitorB; tournament.NextWinnerStepsDone++; Debug.Assert(tournament.NextWinnerStepsDone <= tournament.NextWinnerStepsMax); tournament.GlobalStepsDone++; Debug.Assert(tournament.GlobalStepsDone <= tournament.GlobalStepsMax); } return(await BestCompetitor.BestNodeAsync(tournament, comparator, cancellationToken)); }