Przeglądaj źródła

异步foreach和异步select

懒得勤快 4 lat temu
rodzic
commit
d29d7d09cc

+ 48 - 9
Masuit.Tools.Abstractions/Extensions/BaseType/IEnumerableExtensions.cs

@@ -2,6 +2,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace Masuit.Tools
@@ -28,17 +29,42 @@ namespace Masuit.Tools
 
         #region AsyncForEach
 
-        /// <summary>
-        /// 遍历IEnumerable
-        /// </summary>
-        /// <param name="objs"></param>
-        /// <param name="action">回调方法</param>
-        /// <typeparam name="T"></typeparam>
-        public static async void ForEachAsync<T>(this IEnumerable<T> objs, Action<T> action)
+        public static async Task ForeachAsync<T>(this IEnumerable<T> source, int maxParallelCount, Func<T, Task> action)
         {
-            await Task.Run(() => Parallel.ForEach(objs, action));
-        }
+            using SemaphoreSlim completeSemphoreSlim = new(1);
+            using SemaphoreSlim taskCountLimitsemaphoreSlim = new(maxParallelCount);
+            await completeSemphoreSlim.WaitAsync();
+            int runningtaskCount = source.Count();
+
+            foreach (var item in source)
+            {
+                await taskCountLimitsemaphoreSlim.WaitAsync();
+                Task.Run(async () =>
+                {
+                    try
+                    {
+                        await action(item).ContinueWith(task =>
+                        {
+                            Interlocked.Decrement(ref runningtaskCount);
+                            if (runningtaskCount == 0)
+                            {
+                                completeSemphoreSlim.Release();
+                            }
+                        });
+                    }
+                    finally
+                    {
+                        taskCountLimitsemaphoreSlim.Release();
+                    }
+                });
+            }
 
+            await completeSemphoreSlim.WaitAsync();
+        }
+        public static async Task ForeachAsync<T>(this IEnumerable<T> source, Func<T, Task> action)
+        {
+            await ForeachAsync(source, source.Count(), action);
+        }
         #endregion AsyncForEach
 
         /// <summary>
@@ -176,5 +202,18 @@ namespace Masuit.Tools
             set.UnionWith(source.Select(selector));
             return set;
         }
+
+        /// <summary>
+        /// 异步Select
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <typeparam name="TResult"></typeparam>
+        /// <param name="source"></param>
+        /// <param name="selector"></param>
+        /// <returns></returns>
+        public static async Task<IEnumerable<TResult>> SelectAsync<T, TResult>(this IEnumerable<T> source, Func<T, Task<TResult>> selector)
+        {
+            return await Task.WhenAll(source.Select(selector));
+        }
     }
 }

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

@@ -7,7 +7,7 @@
     <LangVersion>9.0</LangVersion>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CodeAnalysisRuleSet />
-    <Version>2.4.2.3</Version>
+    <Version>2.4.2.4</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.4.2.3</FileVersion>
+    <FileVersion>2.4.2.4</FileVersion>
     <Company>masuit.com</Company>
-    <AssemblyVersion>2.4.2.3</AssemblyVersion>
+    <AssemblyVersion>2.4.2.4</AssemblyVersion>
     <PackageLicenseUrl>https://github.com/ldqk/Masuit.Tools/blob/master/LICENSE</PackageLicenseUrl>
     <EmbedUntrackedSources>true</EmbedUntrackedSources>
     <IncludeSymbols>true</IncludeSymbols>

+ 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.4.2.3</Version>
-        <FileVersion>2.4.2.3</FileVersion>
+        <Version>2.4.2.4</Version>
+        <FileVersion>2.4.2.4</FileVersion>
         <Company>masuit.com</Company>
-        <AssemblyVersion>2.4.2.3</AssemblyVersion>
+        <AssemblyVersion>2.4.2.4</AssemblyVersion>
         <Authors>懒得勤快X</Authors>
         <RepositoryUrl>https://github.com/ldqk/Masuit.Tools</RepositoryUrl>
         <EmbedUntrackedSources>true</EmbedUntrackedSources>

BIN
Masuit.Tools/Properties/AssemblyInfo.cs


+ 1 - 1
Masuit.Tools/package.nuspec

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