コード例 #1
0
 public CdnClient(SteamKit2.CDNClient cdnClient, CdnServerWrapper serverWrapper)
 {
     InternalCdnClient = cdnClient;
     ServerWrapper     = serverWrapper;
 }
コード例 #2
0
        public async Task FillServerPoolAsync()
        {
            // Await until we've logged in and have our suggest cell ID
            await _steamContentClient.SteamClient.AwaitReadyAsync(_steamContentClient.SteamClient.CancellationToken);

            // Add any not-yet-tracked servers
            var servers = await GetServersAsync();

            foreach (var server in servers)
            {
                if (_servers.Any(x => x.Server.Host == server.Host))
                {
                    continue;
                }

                var serverWrapper     = new CdnServerWrapper(server);
                var qualityFromMemory = _steamContentServerQualities.FirstOrDefault(x => x.Host == serverWrapper.Server.Host);

                if (qualityFromMemory != null)
                {
                    serverWrapper.Score = qualityFromMemory.Score;
                }

                _servers.Add(serverWrapper);
            }


            // Fresh database over server quality
            if (_servers.Sum(x => x.Score) == 0)
            {
                foreach (var serverWrapper in _servers)
                {
                    for (int i = 0; i < serverWrapper.Server.NumEntries; i++)
                    {
                        var cdnClient = new CDNClient(_steamContentClient.SteamClient.InternalClient);

                        //await cdnClient.ConnectAsync(serverWrapper.Server);

                        var wrapper = new CdnClient(cdnClient, serverWrapper);

                        _cdnClientWrappersAvailable.Add(wrapper);
                    }
                }
            }
            else
            {
                var orderedServers   = new Queue <CdnServerWrapper>(_servers.OrderByDescending(x => x.Score).OrderBy(x => x.Server.WeightedLoad).OrderBy(x => x.Server.Load));
                int refillsRemaining = CLIENTS_REFILL_LIMIT;

                while (orderedServers.Count > 0)
                {
                    var serverWrapper = orderedServers.Dequeue();

                    for (int i = 0; i < serverWrapper.Server.NumEntries; i++)
                    {
                        var cdnClient = new CDNClient(_steamContentClient.SteamClient.InternalClient);
                        var wrapper   = new CdnClient(cdnClient, serverWrapper);

                        _cdnClientWrappersAvailable.Add(wrapper);

                        if (--refillsRemaining <= 0)
                        {
                            break;
                        }
                    }
                }
            }

            _poolFilledEvent.Set();
        }