public ServerList(ISupportServers game, UserSettings settings, IEventAggregator eventBus, IGameServerQueryHandler queryHandler, IGameContext gameContext) { _eventBus = eventBus; _queryHandler = queryHandler; _gameContext = gameContext; _settings = settings; _listTimer = new TimerWithElapsedCancellationAsync(GetTimerValue(), ListTimerElapsed, null); _serverTimer = new TimerWithElapsedCancellationAsync(ServerUpdateFrequency, ServerTimerElapsed); Game = game; Filter = Game.GetServerFilter(); ServerQueryQueue = new ServerQueryQueue(); }
async Task SyncAndProcess() { var ms = ((Game)Game).CalculatedSettings.Collection; var moddingFilter = Filter as IHaveModdingFilters; var servers = moddingFilter == null || (ms == null && !moddingFilter.Modded && !moddingFilter.IncompatibleServers) ? Items.ToArray() : Items.Where(server => server.HasMod(ms, moddingFilter.Modded, moddingFilter.IncompatibleServers)) .ToArray(); if (!servers.Any()) { return; } using (_cancellationToken = new CancellationTokenSource()) { await ServerQueryQueue.SyncAsync(servers, _cancellationToken.Token).ConfigureAwait(false); _cancellationToken = null; } }
async Task UpdateAllInternal() { #if DEBUG var sw = new Stopwatch(); sw.Start(); #endif var queue = new ServerQueryQueue(); ServerQueryQueue = queue; try { await SyncAndProcess().ConfigureAwait(false); } finally { #if DEBUG sw.Stop(); this.Logger().Debug( "Done processing servers: {0} (Canceled: {1}, TotalSI: {2}). Took: {3}s", queue.State.Progress, queue.State.Canceled, TotalCount, sw.Elapsed.TotalSeconds); #endif _eventBus.PublishOnCurrentThread(new ServersUpdated()); } }