From 5f9a43d02adb75e7008ca18482f29b02d2b3d9ed Mon Sep 17 00:00:00 2001 From: Christiaan Rakowski Date: Sun, 8 Jun 2025 17:09:54 +0200 Subject: [PATCH 1/4] Cleaned up build warnings --- .../CSRakowski.Parallel.csproj | 5 ++++ .../ParallelAsyncEx.AsyncStreams.cs | 5 ++-- .../ParallelAsync.AsyncStreams.cs | 30 +++++++++++++++---- tests/Profiling/Profiling.csproj | 3 -- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/CSRakowski.Parallel/CSRakowski.Parallel.csproj b/src/CSRakowski.Parallel/CSRakowski.Parallel.csproj index 7ac3cac..d32f269 100644 --- a/src/CSRakowski.Parallel/CSRakowski.Parallel.csproj +++ b/src/CSRakowski.Parallel/CSRakowski.Parallel.csproj @@ -21,6 +21,11 @@ CSRakowski.Parallel + + + $(NoWarn);NETSDK1215 + + bin\$(Configuration)\$(TargetFramework)\CSRakowski.Parallel.xml diff --git a/src/CSRakowski.Parallel/Extensions/ParallelAsyncEx.AsyncStreams.cs b/src/CSRakowski.Parallel/Extensions/ParallelAsyncEx.AsyncStreams.cs index 27c1964..58acf16 100644 --- a/src/CSRakowski.Parallel/Extensions/ParallelAsyncEx.AsyncStreams.cs +++ b/src/CSRakowski.Parallel/Extensions/ParallelAsyncEx.AsyncStreams.cs @@ -28,7 +28,7 @@ public static partial class ParallelAsyncEx /// The results of the operations /// Thrown when either or is null. /// Thrown when the configured maximum batch size is a negative number. - public static IAsyncEnumerable ForEachAsyncStream(this IParallelAsyncEnumerable parallelAsync, Func> func, [EnumeratorCancellation] CancellationToken cancellationToken = default) + public static IAsyncEnumerable ForEachAsyncStream(this IParallelAsyncEnumerable parallelAsync, Func> func, CancellationToken cancellationToken = default) { var obj = EnsureValidEnumerable(parallelAsync); @@ -53,7 +53,7 @@ public static IAsyncEnumerable ForEachAsyncStream(this /// The results of the operations /// Thrown when either or is null. /// Thrown when the configured maximum batch size is a negative number. - public static IAsyncEnumerable ForEachAsyncStream(this IParallelAsyncEnumerable parallelAsync, Func> func, [EnumeratorCancellation] CancellationToken cancellationToken = default) + public static IAsyncEnumerable ForEachAsyncStream(this IParallelAsyncEnumerable parallelAsync, Func> func, CancellationToken cancellationToken = default) { var obj = EnsureValidEnumerable(parallelAsync); @@ -71,5 +71,4 @@ public static IAsyncEnumerable ForEachAsyncStream(this } #endif //NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - } diff --git a/src/CSRakowski.Parallel/ParallelAsync.AsyncStreams.cs b/src/CSRakowski.Parallel/ParallelAsync.AsyncStreams.cs index 0f8e0b7..b0cd1ed 100644 --- a/src/CSRakowski.Parallel/ParallelAsync.AsyncStreams.cs +++ b/src/CSRakowski.Parallel/ParallelAsync.AsyncStreams.cs @@ -41,12 +41,16 @@ public static partial class ParallelAsync /// Setting this value to low, will mean a too small list will be allocated and you will have to pay a small performance hit for the resizing of the list during execution. /// /// - public static IAsyncEnumerable ForEachAsyncStream(IEnumerable collection, Func> func, int maxBatchSize = 0, bool allowOutOfOrderProcessing = false, int estimatedResultSize = 0, [EnumeratorCancellation] CancellationToken cancellationToken = default) + public static IAsyncEnumerable ForEachAsyncStream(IEnumerable collection, Func> func, int maxBatchSize = 0, bool allowOutOfOrderProcessing = false, int estimatedResultSize = 0, CancellationToken cancellationToken = default) { +#if NET8_0_OR_GREATER + ArgumentNullException.ThrowIfNull(func); +#else if (func == null) { throw new ArgumentNullException(nameof(func)); } +#endif //NET8_0_OR_GREATER var funcWithCancellationToken = WrapFunc(func); return ForEachAsyncStream(collection, funcWithCancellationToken, maxBatchSize, allowOutOfOrderProcessing, estimatedResultSize, cancellationToken); @@ -80,8 +84,12 @@ public static IAsyncEnumerable ForEachAsyncStream(IEnumer /// Setting this value to low, will mean a too small list will be allocated and you will have to pay a small performance hit for the resizing of the list during execution. /// /// - public static IAsyncEnumerable ForEachAsyncStream(IEnumerable collection, Func> func, int maxBatchSize = 0, bool allowOutOfOrderProcessing = false, int estimatedResultSize = 0, [EnumeratorCancellation] CancellationToken cancellationToken = default) + public static IAsyncEnumerable ForEachAsyncStream(IEnumerable collection, Func> func, int maxBatchSize = 0, bool allowOutOfOrderProcessing = false, int estimatedResultSize = 0, CancellationToken cancellationToken = default) { +#if NET8_0_OR_GREATER + ArgumentNullException.ThrowIfNull(collection); + ArgumentNullException.ThrowIfNull(func); +#else if (collection == null) { throw new ArgumentNullException(nameof(collection)); @@ -91,6 +99,7 @@ public static IAsyncEnumerable ForEachAsyncStream(IEnumer { throw new ArgumentNullException(nameof(func)); } +#endif //NET8_0_OR_GREATER var maxBatchSizeToUse = DetermineBatchSizeToUse(maxBatchSize); @@ -319,12 +328,16 @@ private static async IAsyncEnumerable ForEachAsyncStreamImplUnordered /// - public static IAsyncEnumerable ForEachAsyncStream(IAsyncEnumerable collection, Func> func, int maxBatchSize = 0, bool allowOutOfOrderProcessing = false, int estimatedResultSize = 0, [EnumeratorCancellation] CancellationToken cancellationToken = default) + public static IAsyncEnumerable ForEachAsyncStream(IAsyncEnumerable collection, Func> func, int maxBatchSize = 0, bool allowOutOfOrderProcessing = false, int estimatedResultSize = 0, CancellationToken cancellationToken = default) { +#if NET8_0_OR_GREATER + ArgumentNullException.ThrowIfNull(func); +#else if (func == null) { throw new ArgumentNullException(nameof(func)); } +#endif //NET8_0_OR_GREATER var funcWithCancellationToken = WrapFunc(func); return ForEachAsyncStream(collection, funcWithCancellationToken, maxBatchSize, allowOutOfOrderProcessing, estimatedResultSize, cancellationToken); @@ -358,8 +371,12 @@ public static IAsyncEnumerable ForEachAsyncStream(IAsyncE /// Setting this value to low, will mean a too small list will be allocated and you will have to pay a small performance hit for the resizing of the list during execution. /// /// - public static IAsyncEnumerable ForEachAsyncStream(IAsyncEnumerable collection, Func> func, int maxBatchSize = 0, bool allowOutOfOrderProcessing = false, int estimatedResultSize = 0, [EnumeratorCancellation] CancellationToken cancellationToken = default) + public static IAsyncEnumerable ForEachAsyncStream(IAsyncEnumerable collection, Func> func, int maxBatchSize = 0, bool allowOutOfOrderProcessing = false, int estimatedResultSize = 0, CancellationToken cancellationToken = default) { +#if NET8_0_OR_GREATER + ArgumentNullException.ThrowIfNull(collection); + ArgumentNullException.ThrowIfNull(func); +#else if (collection == null) { throw new ArgumentNullException(nameof(collection)); @@ -369,6 +386,7 @@ public static IAsyncEnumerable ForEachAsyncStream(IAsyncE { throw new ArgumentNullException(nameof(func)); } +#endif //NET8_0_OR_GREATER int maxBatchSizeToUse = DetermineBatchSizeToUse(maxBatchSize); @@ -555,8 +573,8 @@ private static async IAsyncEnumerable ForEachAsyncStreamImplUnorderedAs ParallelAsyncEventSource.Log.RunStop(runId); } - #endregion IAsyncEnumerable +#endregion IAsyncEnumerable } #endif //NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER -} + } diff --git a/tests/Profiling/Profiling.csproj b/tests/Profiling/Profiling.csproj index 46727f5..aa9c034 100644 --- a/tests/Profiling/Profiling.csproj +++ b/tests/Profiling/Profiling.csproj @@ -46,9 +46,6 @@ ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll - From 21a62463ee3163c8977bd332d5adc7d34b9176c0 Mon Sep 17 00:00:00 2001 From: Christiaan Rakowski Date: Sat, 29 Nov 2025 11:14:21 +0100 Subject: [PATCH 2/4] Cleaned up package references a bit --- .../CSRakowski.Parallel.Benchmarks.csproj | 4 +-- .../CSRakowski.Parallel.Tests.csproj | 12 ++++++-- tests/Profiling/App.config | 6 +++- tests/Profiling/Profiling.csproj | 29 +++++++++---------- tests/Profiling/Program.cs | 5 +++- tests/Profiling/packages.config | 7 ----- 6 files changed, 34 insertions(+), 29 deletions(-) delete mode 100644 tests/Profiling/packages.config diff --git a/tests/CSRakowski.Parallel.Benchmarks/CSRakowski.Parallel.Benchmarks.csproj b/tests/CSRakowski.Parallel.Benchmarks/CSRakowski.Parallel.Benchmarks.csproj index 7fae4b4..341281d 100644 --- a/tests/CSRakowski.Parallel.Benchmarks/CSRakowski.Parallel.Benchmarks.csproj +++ b/tests/CSRakowski.Parallel.Benchmarks/CSRakowski.Parallel.Benchmarks.csproj @@ -10,12 +10,12 @@ - + - + diff --git a/tests/CSRakowski.Parallel.Tests/CSRakowski.Parallel.Tests.csproj b/tests/CSRakowski.Parallel.Tests/CSRakowski.Parallel.Tests.csproj index 2404353..3d48967 100644 --- a/tests/CSRakowski.Parallel.Tests/CSRakowski.Parallel.Tests.csproj +++ b/tests/CSRakowski.Parallel.Tests/CSRakowski.Parallel.Tests.csproj @@ -1,4 +1,4 @@ - + net48;net472;net90;net80;net60 @@ -11,9 +11,8 @@ - - + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,6 +23,13 @@ + + + + + + + diff --git a/tests/Profiling/App.config b/tests/Profiling/App.config index 680d7f0..741b8de 100644 --- a/tests/Profiling/App.config +++ b/tests/Profiling/App.config @@ -7,7 +7,11 @@ - + + + + + diff --git a/tests/Profiling/Profiling.csproj b/tests/Profiling/Profiling.csproj index 46727f5..6b55e91 100644 --- a/tests/Profiling/Profiling.csproj +++ b/tests/Profiling/Profiling.csproj @@ -35,20 +35,8 @@ false - - ..\..\packages\CSRakowski.AsyncStreamsPreparations.1.5.1\lib\netstandard2.0\CSRakowski.AsyncStreamsPreparations.dll - - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.7.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll - - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll - @@ -62,9 +50,6 @@ - - Designer - @@ -72,5 +57,19 @@ CSRakowski.Parallel + + + 1.6.0 + + + 7.0.0 + + + 6.1.2 + + + 4.6.3 + + \ No newline at end of file diff --git a/tests/Profiling/Program.cs b/tests/Profiling/Program.cs index c520b06..a7d4038 100644 --- a/tests/Profiling/Program.cs +++ b/tests/Profiling/Program.cs @@ -32,7 +32,10 @@ public static async Task Main(string[] args) return 1; /*/ var resultCount = results.Count(); - return resultCount; + + return (resultCount == numberOfElements) + ? 0 + : numberOfElements - resultCount; //*/ } diff --git a/tests/Profiling/packages.config b/tests/Profiling/packages.config deleted file mode 100644 index 7b6b9a8..0000000 --- a/tests/Profiling/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file From e46276841f1265c22f5c1ca3ab5898905dc7d783 Mon Sep 17 00:00:00 2001 From: Christiaan Rakowski Date: Sat, 29 Nov 2025 12:30:36 +0100 Subject: [PATCH 3/4] Dropped all out-of-support Target Frameworks --- .../CSRakowski.Parallel.csproj | 13 +------ .../ParallelAsyncEx.AsyncStreams.cs | 4 -- .../ParallelAsync.AsyncStreams.cs | 5 +-- .../ParallelAsyncBenchmarks_AsyncStreams.cs | 16 -------- .../ExtensionMethodsTests.cs | 4 +- .../ExtensionMethodsTests_AsyncStreams.cs | 5 --- .../ExtensionMethodsTests_IAsyncEnumerable.cs | 4 +- .../Mocks and Helpers/TaskHelper.cs | 38 ------------------- .../ParallelAsyncTests.cs | 14 +++---- .../ParallelAsyncTests_AsyncStreams.cs | 5 --- .../ParallelAsyncTests_IAsyncEnumerable.cs | 14 +++---- 11 files changed, 21 insertions(+), 101 deletions(-) delete mode 100644 tests/CSRakowski.Parallel.Tests/Mocks and Helpers/TaskHelper.cs diff --git a/src/CSRakowski.Parallel/CSRakowski.Parallel.csproj b/src/CSRakowski.Parallel/CSRakowski.Parallel.csproj index d32f269..2e35a7e 100644 --- a/src/CSRakowski.Parallel/CSRakowski.Parallel.csproj +++ b/src/CSRakowski.Parallel/CSRakowski.Parallel.csproj @@ -1,7 +1,7 @@  - net472;net80;net60;netstandard2.1;netstandard2.0;netstandard1.1 + net80;net472;netstandard2.0 true CSRakowski.ParallelAsync @@ -21,21 +21,12 @@ CSRakowski.Parallel - - - $(NoWarn);NETSDK1215 - - bin\$(Configuration)\$(TargetFramework)\CSRakowski.Parallel.xml - - - - - + diff --git a/src/CSRakowski.Parallel/Extensions/ParallelAsyncEx.AsyncStreams.cs b/src/CSRakowski.Parallel/Extensions/ParallelAsyncEx.AsyncStreams.cs index 58acf16..5ac2730 100644 --- a/src/CSRakowski.Parallel/Extensions/ParallelAsyncEx.AsyncStreams.cs +++ b/src/CSRakowski.Parallel/Extensions/ParallelAsyncEx.AsyncStreams.cs @@ -8,8 +8,6 @@ namespace CSRakowski.Parallel.Extensions { - #if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - /// /// Extension methods to allow using the functionalities of with a fluent syntax /// @@ -69,6 +67,4 @@ public static IAsyncEnumerable ForEachAsyncStream(this #endregion ForEachAsyncStream overloads } - - #endif //NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER } diff --git a/src/CSRakowski.Parallel/ParallelAsync.AsyncStreams.cs b/src/CSRakowski.Parallel/ParallelAsync.AsyncStreams.cs index b0cd1ed..0fe45e0 100644 --- a/src/CSRakowski.Parallel/ParallelAsync.AsyncStreams.cs +++ b/src/CSRakowski.Parallel/ParallelAsync.AsyncStreams.cs @@ -7,8 +7,6 @@ namespace CSRakowski.Parallel { -#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - public static partial class ParallelAsync { #region IEnumerable @@ -576,5 +574,4 @@ private static async IAsyncEnumerable ForEachAsyncStreamImplUnorderedAs #endregion IAsyncEnumerable } -#endif //NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - } +} diff --git a/tests/CSRakowski.Parallel.Benchmarks/Benchmarks/ParallelAsyncBenchmarks_AsyncStreams.cs b/tests/CSRakowski.Parallel.Benchmarks/Benchmarks/ParallelAsyncBenchmarks_AsyncStreams.cs index 1563110..4b1d10d 100644 --- a/tests/CSRakowski.Parallel.Benchmarks/Benchmarks/ParallelAsyncBenchmarks_AsyncStreams.cs +++ b/tests/CSRakowski.Parallel.Benchmarks/Benchmarks/ParallelAsyncBenchmarks_AsyncStreams.cs @@ -65,19 +65,11 @@ public async Task IEnumerable_ForEachAsyncStream() { int count = 0; -#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - await foreach (var r in ParallelAsync.ForEachAsyncStream(InputNumbers, TestFunctions.JustAddOne_WithCancellationToken, MaxBatchSize, AllowOutOfOrder, NumberOfItemsInCollection, CancellationToken.None)) { count++; } -#else - - await Task.CompletedTask; - -#endif //NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - return count; } @@ -86,18 +78,10 @@ public async Task IAsyncEnumerable_ForEachAsyncStream() { int count = 0; -#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - await foreach (var r in ParallelAsync.ForEachAsyncStream(InputNumbersAsync, TestFunctions.JustAddOne_WithCancellationToken, MaxBatchSize, AllowOutOfOrder, NumberOfItemsInCollection, CancellationToken.None)) { count++; } - -#else - - await Task.CompletedTask; - -#endif //NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER return count; } diff --git a/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests.cs b/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests.cs index 57f0ca2..b7b3ad4 100644 --- a/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests.cs +++ b/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests.cs @@ -83,7 +83,7 @@ await parallelAsync.ForEachAsync((el) => { Interlocked.Add(ref sum, el); Interlocked.Increment(ref count); - return TaskHelper.CompletedTask; + return Task.CompletedTask; }); Assert.Equal(55, sum); @@ -106,7 +106,7 @@ await parallelAsync.ForEachAsync((el, ct) => { Interlocked.Add(ref sum, el); Interlocked.Increment(ref count); - return TaskHelper.CompletedTask; + return Task.CompletedTask; }); Assert.Equal(55, sum); diff --git a/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests_AsyncStreams.cs b/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests_AsyncStreams.cs index c71308a..fb37d74 100644 --- a/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests_AsyncStreams.cs +++ b/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests_AsyncStreams.cs @@ -14,8 +14,6 @@ namespace CSRakowski.Parallel.Tests { - #if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - [Collection("ParallelAsync AsyncStreams Extension Methods Tests")] public class ExtensionMethodsTests_AsyncStreams { @@ -128,7 +126,4 @@ public async Task ParallelAsync_Can_Chain_Together_AsyncStreams() } } } - - #endif //NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - } diff --git a/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests_IAsyncEnumerable.cs b/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests_IAsyncEnumerable.cs index c2889c9..feeb841 100644 --- a/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests_IAsyncEnumerable.cs +++ b/tests/CSRakowski.Parallel.Tests/ExtensionMethodsTests_IAsyncEnumerable.cs @@ -85,7 +85,7 @@ await parallelAsync.ForEachAsync((el) => { Interlocked.Add(ref sum, el); Interlocked.Increment(ref count); - return TaskHelper.CompletedTask; + return Task.CompletedTask; }); Assert.Equal(55, sum); @@ -108,7 +108,7 @@ await parallelAsync.ForEachAsync((el, ct) => { Interlocked.Add(ref sum, el); Interlocked.Increment(ref count); - return TaskHelper.CompletedTask; + return Task.CompletedTask; }); Assert.Equal(55, sum); diff --git a/tests/CSRakowski.Parallel.Tests/Mocks and Helpers/TaskHelper.cs b/tests/CSRakowski.Parallel.Tests/Mocks and Helpers/TaskHelper.cs deleted file mode 100644 index 7d66a55..0000000 --- a/tests/CSRakowski.Parallel.Tests/Mocks and Helpers/TaskHelper.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CSRakowski.Parallel.Tests.Helpers -{ - /// - /// As Task.CompletedTask is not available on 4.5, I slightly modified the code found here: http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs,66f1c3e3e272f591 - /// - internal static class TaskHelper - { - /// - /// A task that's already been completed successfully. - /// - private static Task s_completedTask; - - /// Gets a task that's already been completed successfully. - /// May not always return the same instance. - public static Task CompletedTask - { - get - { - var completedTask = s_completedTask; - if (completedTask == null) - { -#if NET452 - s_completedTask = completedTask = Task.FromResult(true); -#else - s_completedTask = completedTask = Task.CompletedTask; -#endif - } - return completedTask; - } - } - } -} diff --git a/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests.cs b/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests.cs index 6bb99a8..beb7eb2 100644 --- a/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests.cs +++ b/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests.cs @@ -42,7 +42,7 @@ public async Task ParallelAsync_Can_Batch_Basic_Work_Void() await ParallelAsync.ForEachAsync(input, (el) => { - return TaskHelper.CompletedTask; + return Task.CompletedTask; }, maxBatchSize: 1); Assert.True(true); @@ -105,7 +105,7 @@ public async Task ParallelAsync_Can_Handle_Misaligned_Sizing_Void() await ParallelAsync.ForEachAsync(input, (el) => { - return TaskHelper.CompletedTask; + return Task.CompletedTask; }, maxBatchSize: 4, cancellationToken: cancellationToken); Assert.True(true); @@ -120,7 +120,7 @@ public async Task ParallelAsync_Can_Handle_Misaligned_Sizing_Void_Without_Estima await ParallelAsync.ForEachAsync(input, (el) => { - return TaskHelper.CompletedTask; + return Task.CompletedTask; }, maxBatchSize: 4, cancellationToken: cancellationToken); Assert.True(true); @@ -221,8 +221,8 @@ public async Task ParallelAsync_Throws_On_Invalid_Inputs() var empty = new int[0]; IEnumerable nullEnumerable = null; - var ex1 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e) => TaskHelper.CompletedTask)); - var ex2 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e, ct) => TaskHelper.CompletedTask)); + var ex1 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e) => Task.CompletedTask)); + var ex2 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e, ct) => Task.CompletedTask)); var ex3 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e) => Task.FromResult(e))); var ex4 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e, ct) => Task.FromResult(e))); @@ -233,7 +233,7 @@ public async Task ParallelAsync_Throws_On_Invalid_Inputs() var ex7 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(empty, (Func>)null)); var ex8 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(empty, (Func>)null)); - var ex9 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(empty, (e) => TaskHelper.CompletedTask, -1)); + var ex9 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(empty, (e) => Task.CompletedTask, -1)); Assert.Equal("collection", ex1.ParamName); Assert.Equal("collection", ex2.ParamName); @@ -277,7 +277,7 @@ await ParallelAsync.ForEachAsync(input, (el) => { var r = el + Interlocked.Increment(ref callCount); - return TaskHelper.CompletedTask; + return Task.CompletedTask; }, maxBatchSize: 9, allowOutOfOrderProcessing: true); Assert.Equal(numberOfElements, callCount); diff --git a/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests_AsyncStreams.cs b/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests_AsyncStreams.cs index 828a000..28876bd 100644 --- a/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests_AsyncStreams.cs +++ b/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests_AsyncStreams.cs @@ -13,8 +13,6 @@ namespace CSRakowski.Parallel.Tests { - #if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - [Collection("ParallelAsync AsyncStreams Tests")] public class ParallelAsyncTests_AsyncStreams { @@ -266,7 +264,4 @@ public async Task ParallelAsync_Can_Chain_Together_AsyncStreams() } } } - - #endif //NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_0_OR_GREATER - } diff --git a/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests_IAsyncEnumerable.cs b/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests_IAsyncEnumerable.cs index a0f8c12..c843e94 100644 --- a/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests_IAsyncEnumerable.cs +++ b/tests/CSRakowski.Parallel.Tests/ParallelAsyncTests_IAsyncEnumerable.cs @@ -44,7 +44,7 @@ public async Task ParallelAsync_Can_Batch_Basic_Work_Void() await ParallelAsync.ForEachAsync(input, (el) => { - return TaskHelper.CompletedTask; + return Task.CompletedTask; }, maxBatchSize: 1); Assert.True(true); @@ -107,7 +107,7 @@ public async Task ParallelAsync_Can_Handle_Misaligned_Sizing_Void() await ParallelAsync.ForEachAsync(input, (el) => { - return TaskHelper.CompletedTask; + return Task.CompletedTask; }, maxBatchSize: 4, cancellationToken: cancellationToken); Assert.True(true); @@ -122,7 +122,7 @@ public async Task ParallelAsync_Can_Handle_Misaligned_Sizing_Void_Without_Estima await ParallelAsync.ForEachAsync(input, (el) => { - return TaskHelper.CompletedTask; + return Task.CompletedTask; }, maxBatchSize: 4, cancellationToken: cancellationToken); Assert.True(true); @@ -223,8 +223,8 @@ public async Task ParallelAsync_Throws_On_Invalid_Inputs() var empty = new int[0].AsAsyncEnumerable(); IAsyncEnumerable nullEnumerable = null; - var ex1 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e) => TaskHelper.CompletedTask)); - var ex2 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e, ct) => TaskHelper.CompletedTask)); + var ex1 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e) => Task.CompletedTask)); + var ex2 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e, ct) => Task.CompletedTask)); var ex3 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e) => Task.FromResult(e))); var ex4 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(nullEnumerable, (e, ct) => Task.FromResult(e))); @@ -235,7 +235,7 @@ public async Task ParallelAsync_Throws_On_Invalid_Inputs() var ex7 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(empty, (Func>)null)); var ex8 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(empty, (Func>)null)); - var ex9 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(empty, (e) => TaskHelper.CompletedTask, -1)); + var ex9 = await Assert.ThrowsAsync(() => ParallelAsync.ForEachAsync(empty, (e) => Task.CompletedTask, -1)); Assert.Equal("collection", ex1.ParamName); Assert.Equal("collection", ex2.ParamName); @@ -279,7 +279,7 @@ await ParallelAsync.ForEachAsync(input, (el) => { var r = el + Interlocked.Increment(ref callCount); - return TaskHelper.CompletedTask; + return Task.CompletedTask; }, maxBatchSize: 9, allowOutOfOrderProcessing: true); Assert.Equal(numberOfElements, callCount); From 47202489caa36a604963d953cf14212054cae281 Mon Sep 17 00:00:00 2001 From: Christiaan Rakowski Date: Sat, 29 Nov 2025 14:32:00 +0100 Subject: [PATCH 4/4] Updated pipeline actions --- .github/workflows/dotnetcore.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index 8d43762..9ad3446 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -15,20 +15,20 @@ jobs: steps: - name: Check out code onto host - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup .Net 6.0 - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: '6.0.x' # SDK Version to use. - name: Setup .Net 8.0 - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: '8.0.x' # SDK Version to use. - name: Setup .Net 9.0 - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: '9.0.x' # SDK Version to use. @@ -58,7 +58,7 @@ jobs: if: matrix.framework == 'net80' - name: Upload dotnet test results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: dotnet-results-${{ matrix.os }}-${{ matrix.framework }} path: TestResults-${{ matrix.os }}-${{ matrix.framework }} @@ -66,7 +66,7 @@ jobs: if: ${{ always() }} - name: Upload BenchmarkDotNet results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: BenchmarkDotNet-${{ matrix.os }}-${{ matrix.framework }} path: BenchmarkDotNet.Artifacts @@ -84,13 +84,13 @@ jobs: steps: - name: Check out code onto host - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Add msbuild to PATH - uses: microsoft/setup-msbuild@v1.3.1 + uses: microsoft/setup-msbuild@v2 - name: Setup .Net 8.0 - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: '8.0.x' # SDK Version to use. @@ -114,7 +114,7 @@ jobs: dotnet test --no-restore --configuration Release --verbosity normal --framework=${{ matrix.framework }} --logger trx --results-directory "TestResults-${{ matrix.os }}-${{ matrix.framework }}" - name: Upload dotnet test results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: dotnet-results-windows-latest-${{ matrix.framework }} path: TestResults-windows-latest-${{ matrix.framework }}