diff --git a/DepotDownloader/CDNClientPool.cs b/DepotDownloader/CDNClientPool.cs index 9ae1ebf..ec6becd 100644 --- a/DepotDownloader/CDNClientPool.cs +++ b/DepotDownloader/CDNClientPool.cs @@ -24,6 +24,7 @@ namespace DepotDownloader private AutoResetEvent populatePoolEvent; private Task monitorTask; + private CancellationTokenSource shutdownToken; public CancellationTokenSource ExhaustedToken { get; set; } public CDNClientPool(Steam3Session steamSession) @@ -35,15 +36,21 @@ namespace DepotDownloader availableServerEndpoints = new BlockingCollection(); populatePoolEvent = new AutoResetEvent(true); + shutdownToken = new CancellationTokenSource(); monitorTask = Task.Factory.StartNew(ConnectionPoolMonitorAsync).Unwrap(); } + public void Shutdown() + { + shutdownToken.Cancel(); + } + private async Task> FetchBootstrapServerListAsync() { CDNClient bootstrap = new CDNClient(steamSession.steamClient); - while (true) + while (!shutdownToken.IsCancellationRequested) { try { @@ -58,13 +65,15 @@ namespace DepotDownloader Console.WriteLine("Failed to retrieve content server list: {0}", ex.Message); } } + + return null; } private async Task ConnectionPoolMonitorAsync() { bool didPopulate = false; - while(true) + while(!shutdownToken.IsCancellationRequested) { populatePoolEvent.WaitOne(TimeSpan.FromSeconds(1)); @@ -75,6 +84,12 @@ namespace DepotDownloader { var servers = await FetchBootstrapServerListAsync().ConfigureAwait(false); + if (servers == null) + { + ExhaustedToken?.Cancel(); + return; + } + var weightedCdnServers = servers.Select(x => { int penalty = 0; @@ -95,6 +110,7 @@ namespace DepotDownloader else if ( availableServerEndpoints.Count == 0 && !steamSession.steamClient.IsConnected && didPopulate ) { ExhaustedToken?.Cancel(); + return; } } } diff --git a/DepotDownloader/ContentDownloader.cs b/DepotDownloader/ContentDownloader.cs index 51bf5df..b2c99ab 100644 --- a/DepotDownloader/ContentDownloader.cs +++ b/DepotDownloader/ContentDownloader.cs @@ -363,6 +363,12 @@ namespace DepotDownloader public static void ShutdownSteam3() { + if (cdnPool != null) + { + cdnPool.Shutdown(); + cdnPool = null; + } + if ( steam3 == null ) return;