diff --git a/FastGithub.DomainResolve/DomainResolver.cs b/FastGithub.DomainResolve/DomainResolver.cs index 816d0b1..5081d5b 100644 --- a/FastGithub.DomainResolve/DomainResolver.cs +++ b/FastGithub.DomainResolve/DomainResolver.cs @@ -103,13 +103,7 @@ namespace FastGithub.DomainResolve var dnsEndPoint = keyValue.Key; var oldAddresses = keyValue.Value; - var hashSet = new HashSet(oldAddresses); - await foreach (var address in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken)) - { - hashSet.Add(address); - } - - var newAddresses = await this.statusService.GetAvailableAddressesAsync(hashSet, dnsEndPoint.Port, cancellationToken); + var newAddresses = await this.statusService.GetAvailableAddressesAsync(dnsEndPoint, cancellationToken); if (oldAddresses.SequenceEqual(newAddresses) == false) { this.dnsEndPointAddress[dnsEndPoint] = newAddresses; diff --git a/FastGithub.DomainResolve/IPAddressStatusService.cs b/FastGithub.DomainResolve/IPAddressStatusService.cs index 0ebb56f..9df0037 100644 --- a/FastGithub.DomainResolve/IPAddressStatusService.cs +++ b/FastGithub.DomainResolve/IPAddressStatusService.cs @@ -24,21 +24,37 @@ namespace FastGithub.DomainResolve private readonly TimeSpan connectTimeout = TimeSpan.FromSeconds(5d); private readonly IMemoryCache statusCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); + private readonly DnsClient dnsClient; + + /// + /// IP状态服务 + /// + /// + public IPAddressStatusService(DnsClient dnsClient) + { + this.dnsClient = dnsClient; + } + /// /// 并行获取可连接的IP /// - /// - /// + /// /// /// - public async Task GetAvailableAddressesAsync(IEnumerable addresses, int port, CancellationToken cancellationToken) + public async Task GetAvailableAddressesAsync(DnsEndPoint dnsEndPoint, CancellationToken cancellationToken) { - if (addresses.Any() == false) + var addresses = new List(); + await foreach (var address in this.dnsClient.ResolveAsync(dnsEndPoint, fastSort: false, cancellationToken)) + { + addresses.Add(address); + } + + if (addresses.Count == 0) { return Array.Empty(); } - var statusTasks = addresses.Select(item => this.GetStatusAsync(item, port, cancellationToken)); + var statusTasks = addresses.Select(address => this.GetStatusAsync(address, dnsEndPoint.Port, cancellationToken)); var statusArray = await Task.WhenAll(statusTasks); return statusArray .Where(item => item.Elapsed < TimeSpan.MaxValue)