Browse Source

改进多线程下载器

懒得勤快 5 years ago
parent
commit
260a9e0305

+ 3 - 3
Masuit.Tools.Abstractions/Masuit.Tools.Abstractions.csproj

@@ -7,7 +7,7 @@
     <LangVersion>8.0</LangVersion>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CodeAnalysisRuleSet />
-    <Version>2.3.1.10</Version>
+    <Version>2.3.2</Version>
     <Authors>懒得勤快</Authors>
     <Description>Masuit.Tools基础公共库</Description>
     <Copyright>懒得勤快,长空X</Copyright>
@@ -20,9 +20,9 @@
     <RepositoryType>Github</RepositoryType>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
     <PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
-    <FileVersion>2.3.1.10</FileVersion>
+    <FileVersion>2.3.2</FileVersion>
     <Company>masuit.com</Company>
-    <AssemblyVersion>2.3.1.10</AssemblyVersion>
+    <AssemblyVersion>2.3.2</AssemblyVersion>
     <PackageLicenseUrl>https://github.com/ldqk/Masuit.Tools/blob/master/LICENSE</PackageLicenseUrl>
   </PropertyGroup>
 

+ 14 - 55
Masuit.Tools.Abstractions/Net/MultiThreadDownloader.cs

@@ -1,4 +1,5 @@
-using System;
+using Masuit.Tools.Systems;
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.IO;
@@ -175,7 +176,7 @@ namespace Masuit.Tools.Net
                 return;
             }
 
-            OrderByRemaining(PartialDownloaderList);
+            PartialDownloaderList.Sort((x, y) => y.RemainingBytes - x.RemainingBytes);
             int rem = PartialDownloaderList[0].RemainingBytes;
             if (rem < 50 * 1024)
             {
@@ -238,7 +239,7 @@ namespace Masuit.Tools.Net
 
             for (int i = 0; i < NumberOfParts; i++)
             {
-                var temp = CreateNewPd(i, NumberOfParts, Size);
+                var temp = CreateNew(i, NumberOfParts, Size);
                 temp.DownloadPartProgressChanged += temp_DownloadPartProgressChanged;
                 temp.DownloadPartCompleted += temp_DownloadPartCompleted;
                 PartialDownloaderList.Add(temp);
@@ -248,22 +249,22 @@ namespace Masuit.Tools.Net
 
         void MergeParts()
         {
-            var mergeOrderedList = SortPDsByFrom(PartialDownloaderList);
+            var mergeOrderedList = PartialDownloaderList.OrderBy(x => x.From);
             var dir = new FileInfo(FilePath).DirectoryName;
             Directory.CreateDirectory(dir);
-            using var fs = new FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite);
-            long totalBytesWritten = 0;
+            using var fs = File.OpenWrite(FilePath);
+            long totalBytesWrite = 0;
             int mergeProgress = 0;
             foreach (var item in mergeOrderedList)
             {
-                using var pds = new FileStream(item.FullPath, FileMode.Open, FileAccess.Read);
+                using var pdi = File.OpenRead(item.FullPath);
                 byte[] buffer = new byte[4096];
                 int read;
-                while ((read = pds.Read(buffer, 0, buffer.Length)) > 0)
+                while ((read = pdi.Read(buffer, 0, buffer.Length)) > 0)
                 {
                     fs.Write(buffer, 0, read);
-                    totalBytesWritten += read;
-                    int temp = (int)(totalBytesWritten * 1d / Size * 100);
+                    totalBytesWrite += read;
+                    int temp = (int)(totalBytesWrite * 1d / Size * 100);
                     if (temp != mergeProgress && FileMergeProgressChanged != null)
                     {
                         mergeProgress = temp;
@@ -282,14 +283,14 @@ namespace Masuit.Tools.Net
             }
         }
 
-        PartialDownloader CreateNewPd(int order, int parts, long contentLength)
+        PartialDownloader CreateNew(int order, int parts, long contentLength)
         {
             int division = (int)contentLength / parts;
             int remaining = (int)contentLength % parts;
             int start = division * order;
             int end = start + division - 1;
-            end += (order == parts - 1) ? remaining : 0;
-            return new PartialDownloader(_url, TempFileDirectory, Guid.NewGuid().ToString(), start, end, true);
+            end += order == parts - 1 ? remaining : 0;
+            return new PartialDownloader(_url, TempFileDirectory, SnowFlake.NewId, start, end, true);
         }
 
         /// <summary>
@@ -312,48 +313,6 @@ namespace Masuit.Tools.Net
             }
         }
 
-        /// <summary>
-        /// 冒泡排序
-        /// </summary>
-        /// <param name="list"></param>
-        private static void BubbleSort(List<PartialDownloader> list)
-        {
-            bool switched = true;
-            while (switched)
-            {
-                switched = false;
-                for (int i = 0; i < list.Count - 1; i++)
-                {
-                    if (list[i].RemainingBytes < list[i + 1].RemainingBytes)
-                    {
-                        PartialDownloader temp = list[i];
-                        list[i] = list[i + 1];
-                        list[i + 1] = temp;
-                        switched = true;
-                    }
-                }
-            }
-        }
-
-        /// <summary>
-        /// Sorts the downloader by From property to merge the parts
-        /// </summary>
-        /// <param name="list"></param>
-        /// <returns></returns>
-        public static List<PartialDownloader> SortPDsByFrom(List<PartialDownloader> list)
-        {
-            return list.OrderBy(x => x.From).ToList();
-        }
-
-        /// <summary>
-        /// 按剩余时间排序
-        /// </summary>
-        /// <param name="list"></param>
-        public static void OrderByRemaining(List<PartialDownloader> list)
-        {
-            BubbleSort(list);
-        }
-
         /// <summary>
         /// 配置请求头
         /// </summary>

+ 0 - 2
Masuit.Tools.Abstractions/Net/PartialDownloader.cs

@@ -164,8 +164,6 @@ namespace Masuit.Tools.Net
                     req.ServicePoint.Expect100Continue = true;
                     req.ProtocolVersion = HttpVersion.Version11;
                     config(req);
-                    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;
-                    ServicePointManager.Expect100Continue = true;
                     if (RangeAllowed)
                     {
                         req.AddRange(From, _to);

+ 3 - 3
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -20,10 +20,10 @@
     <UserSecretsId>830c282f-f7c1-42be-8651-4cd06ac8e73f</UserSecretsId>
     <RepositoryType>Github</RepositoryType>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>2.3.1.10</Version>
-    <FileVersion>2.3.1.10</FileVersion>
+    <Version>2.3.2</Version>
+    <FileVersion>2.3.2</FileVersion>
     <Company>masuit.com</Company>
-    <AssemblyVersion>2.3.1.10</AssemblyVersion>
+    <AssemblyVersion>2.3.2</AssemblyVersion>
     <Authors>懒得勤快X</Authors>
     <RepositoryUrl>https://github.com/ldqk/Masuit.Tools</RepositoryUrl>
   </PropertyGroup>

BIN
Masuit.Tools/Properties/AssemblyInfo.cs


+ 1 - 1
Masuit.Tools/package.nuspec

@@ -4,7 +4,7 @@
     <!--*-->
     <id>Masuit.Tools.Net</id>
     <!--*-->
-    <version>2.3.1.10</version>
+    <version>2.3.2</version>
     <title>Masuit.Tools</title>
     <!--*-->
     <authors>masuit.com</authors>

+ 1 - 3
NetCoreTest/Program.cs

@@ -1,5 +1,4 @@
-using Masuit.Tools;
-using Masuit.Tools.Security;
+using Masuit.Tools.Security;
 using Microsoft.AspNetCore;
 using Microsoft.AspNetCore.Hosting;
 using System;
@@ -11,7 +10,6 @@ namespace NetCoreTest
     {
         public static void Main(string[] args)
         {
-            Console.WriteLine("100.125.124.105".IsPrivateIP());
             var rsaKey = RsaCrypt.GenerateRsaKeys(RsaKeyType.PKCS8, 2048);
             Console.WriteLine(rsaKey.PrivateKey);
             Console.WriteLine(rsaKey.PublicKey);