Browse Source

assets download fix

Veloe 2 years ago
parent
commit
fc6e5b73ac
1 changed files with 18 additions and 14 deletions
  1. 18 14
      VeloeMinecraftLauncher/Utils/Downloader.cs

+ 18 - 14
VeloeMinecraftLauncher/Utils/Downloader.cs

@@ -436,8 +436,8 @@ internal static class Downloader
             var assetsCount = assetsJson?.Objects?.Count ?? 1;
             var assetsIterator = 1;
 
-            List<Task> assetsDownloadTasks = new();
-            using SemaphoreSlim concurrencySemaphore = new(0, 40);
+            List<Task> assetsDownloadTasks = new(assetsJson?.Objects?.Count ?? 1024);
+            using SemaphoreSlim concurrencySemaphore = new(40, 40);
 
             foreach (var asset in assetsJson?.Objects?.DistinctBy(a => a.Value.Hash) ?? new Dictionary<string,Asset>())
             {
@@ -458,24 +458,28 @@ internal static class Downloader
                 
                     if (chksum != asset.Value.Hash)
                     {
-                        concurrencySemaphore.Wait(cancellationToken);
-                        if (!Directory.Exists(assetsPath + "/" + folder))
-                            Directory.CreateDirectory(assetsPath + "/" + folder);
-
-                        Settings.logger.Debug("Downloading asset: {0} ", asset.Value.Hash);
-                        //DownloadingFileName($"Asset {assetsIterator} of {assetsCount}");
-                        DownloadingFileName($"Asset {assetsIterator} of {assetsCount}");                                                      
-                        await DownloadFileAsync(assetsUrl + folder + "/" + asset.Value.Hash, assetsPath + "/" + folder + "/" + asset.Value.Hash, cancellationToken);                                                  
-                        concurrencySemaphore.Release();
+                        await concurrencySemaphore.WaitAsync(cancellationToken);
+                        try
+                        {
+                            if (!Directory.Exists(assetsPath + "/" + folder))
+                                Directory.CreateDirectory(assetsPath + "/" + folder);
+
+                            Settings.logger.Debug("Downloading asset: {0} ", asset.Value.Hash);
+                            //DownloadingFileName($"Asset {assetsIterator} of {assetsCount}");
+                            DownloadingFileName($"Asset {assetsIterator} of {assetsCount}");
+                            await DownloadFileAsync(assetsUrl + folder + "/" + asset.Value.Hash, assetsPath + "/" + folder + "/" + asset.Value.Hash, cancellationToken);
+                        }
+                        finally 
+                        { 
+                            concurrencySemaphore.Release(); 
+                        }
                     }
                     SetProgress(assetsIterator * 100 / assetsCount);
                     Interlocked.Increment(ref assetsIterator);
                     
                 }));
             }
-            
-            Task.WaitAll(assetsDownloadTasks.ToArray());
-            concurrencySemaphore.Release(40);
+            Task.WaitAll(assetsDownloadTasks.ToArray());           
 
             SetProgress(100);
             tasksIterator++;