浏览代码

Clean up ForEachAsync stuff.

Bart De Smet 7 年之前
父节点
当前提交
751176ba4e
共有 1 个文件被更改,包括 47 次插入53 次删除
  1. 47 53
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ForEach.cs

+ 47 - 53
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ForEach.cs

@@ -13,59 +13,39 @@ namespace System.Linq
         public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Action<TSource> action)
         {
             if (source == null)
-            {
                 throw new ArgumentNullException(nameof(source));
-            }
-
             if (action == null)
-            {
                 throw new ArgumentNullException(nameof(action));
-            }
 
-            return ForEachAsync(source, action, CancellationToken.None);
+            return ForEachAsyncCore(source, action, CancellationToken.None);
         }
 
-        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Action<TSource, int> action)
+        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Action<TSource> action, CancellationToken cancellationToken)
         {
             if (source == null)
-            {
                 throw new ArgumentNullException(nameof(source));
-            }
-
             if (action == null)
-            {
                 throw new ArgumentNullException(nameof(action));
-            }
 
-            return ForEachAsync(source, action, CancellationToken.None);
+            return ForEachAsyncCore(source, action, cancellationToken);
         }
 
-        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Action<TSource> action, CancellationToken cancellationToken)
+        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Action<TSource, int> action)
         {
             if (source == null)
-            {
                 throw new ArgumentNullException(nameof(source));
-            }
-
             if (action == null)
-            {
                 throw new ArgumentNullException(nameof(action));
-            }
 
-            return source.ForEachAsync((x, i) => action(x), cancellationToken);
+            return ForEachAsyncCore(source, action, CancellationToken.None);
         }
 
         public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Action<TSource, int> action, CancellationToken cancellationToken)
         {
             if (source == null)
-            {
                 throw new ArgumentNullException(nameof(source));
-            }
-
             if (action == null)
-            {
                 throw new ArgumentNullException(nameof(action));
-            }
 
             return ForEachAsyncCore(source, action, cancellationToken);
         }
@@ -73,61 +53,41 @@ namespace System.Linq
         public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, Task> action)
         {
             if (source == null)
-            {
                 throw new ArgumentNullException(nameof(source));
-            }
-
             if (action == null)
-            {
                 throw new ArgumentNullException(nameof(action));
-            }
 
-            return ForEachAsync(source, action, CancellationToken.None);
+            return ForEachAsyncCore(source, (x, ct) => action(x), CancellationToken.None);
         }
 
-        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, int, Task> action)
+        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, Task> action, CancellationToken cancellationToken)
         {
             if (source == null)
-            {
                 throw new ArgumentNullException(nameof(source));
-            }
-
             if (action == null)
-            {
                 throw new ArgumentNullException(nameof(action));
-            }
 
-            return ForEachAsync(source, action, CancellationToken.None);
+            return ForEachAsyncCore(source, (x, ct) => action(x), cancellationToken);
         }
 
-        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, Task> action, CancellationToken cancellationToken)
+        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, Task> action, CancellationToken cancellationToken)
         {
             if (source == null)
-            {
                 throw new ArgumentNullException(nameof(source));
-            }
-
             if (action == null)
-            {
                 throw new ArgumentNullException(nameof(action));
-            }
 
-            return source.ForEachAsync((x, i, ct) => action(x), cancellationToken);
+            return ForEachAsyncCore(source, action, cancellationToken);
         }
 
-        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, Task> action, CancellationToken cancellationToken)
+        public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, int, Task> action)
         {
             if (source == null)
-            {
                 throw new ArgumentNullException(nameof(source));
-            }
-
             if (action == null)
-            {
                 throw new ArgumentNullException(nameof(action));
-            }
 
-            return source.ForEachAsync((x, i, ct) => action(x, ct), cancellationToken);
+            return ForEachAsyncCore(source, (x, i, ct) => action(x, i), CancellationToken.None);
         }
 
         public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, int, Task> action, CancellationToken cancellationToken)
@@ -137,7 +97,7 @@ namespace System.Linq
             if (action == null)
                 throw new ArgumentNullException(nameof(action));
 
-            return source.ForEachAsync((x, i, ct) => action(x, i), cancellationToken);
+            return ForEachAsyncCore(source, (x, i, ct) => action(x, i), cancellationToken);
         }
 
         public static Task ForEachAsync<TSource>(this IAsyncEnumerable<TSource> source, Func<TSource, int, CancellationToken, Task> action, CancellationToken cancellationToken)
@@ -150,6 +110,40 @@ namespace System.Linq
             return ForEachAsyncCore(source, action, cancellationToken);
         }
 
+        private static async Task ForEachAsyncCore<TSource>(IAsyncEnumerable<TSource> source, Action<TSource> action, CancellationToken cancellationToken)
+        {
+            var e = source.GetAsyncEnumerator(cancellationToken);
+
+            try
+            {
+                while (await e.MoveNextAsync().ConfigureAwait(false))
+                {
+                    action(e.Current);
+                }
+            }
+            finally
+            {
+                await e.DisposeAsync().ConfigureAwait(false);
+            }
+        }
+
+        private static async Task ForEachAsyncCore<TSource>(IAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, Task> action, CancellationToken cancellationToken)
+        {
+            var e = source.GetAsyncEnumerator(cancellationToken);
+
+            try
+            {
+                while (await e.MoveNextAsync().ConfigureAwait(false))
+                {
+                    await action(e.Current, cancellationToken).ConfigureAwait(false);
+                }
+            }
+            finally
+            {
+                await e.DisposeAsync().ConfigureAwait(false);
+            }
+        }
+
         private static async Task ForEachAsyncCore<TSource>(IAsyncEnumerable<TSource> source, Action<TSource, int> action, CancellationToken cancellationToken)
         {
             var index = 0;