diff --git a/Platform.Threading.csproj b/Platform.Threading.csproj index c290a19..b7e853b 100644 --- a/Platform.Threading.csproj +++ b/Platform.Threading.csproj @@ -6,10 +6,10 @@ Platform.Threading 0.1.1 Konstantin Diachenko - net472;netstandard2.0;netstandard3.1;net5;net6 + net8 Platform.Threading Platform.Threading - LinksPlatform;Threading;ISynchronization;ISynchronizationExtensions;ISynchronized;ReaderWriterLockSynchronization;Unsynchronization;ConcurrentQueueExtensions;TaskExtensions;ThreadHelpers + LinksPlatform;Threading;ISynchronization;ISynchronizationExtensions;ISynchronized;ReaderWriterLockSynchronization;Unsynchronization;TaskExtensions;ThreadHelpers https://raw.githubusercontent.com/linksplatform/Documentation/18469f4d033ee9a5b7b84caab9c585acab2ac519/doc/Avatar-rainbow-icon-64x64.png https://linksplatform.github.io/Threading Unlicensed diff --git a/cpp/Platform.Threading/ConcurrentQueueExtensions.h b/cpp/Platform.Threading/ConcurrentQueueExtensions.h deleted file mode 100644 index a7337a4..0000000 --- a/cpp/Platform.Threading/ConcurrentQueueExtensions.h +++ /dev/null @@ -1,23 +0,0 @@ -namespace Platform::Threading -{ - class ConcurrentQueueExtensions - { - public: static async Task AwaitAll(ConcurrentQueue queue) - { - foreach (auto item in queue.DequeueAll()) - { - await item.ConfigureAwait(continueOnCapturedContext: false); - } - } - - public: static async Task AwaitOne(ConcurrentQueue queue) - { - if (queue.TryDequeue(out Task item)) - { - await item.ConfigureAwait(continueOnCapturedContext: false); - } - } - - public: static void EnqueueAsRunnedTask(ConcurrentQueue queue, std::function action) { queue.Enqueue(Task.Run(action)); } - }; -} diff --git a/csharp/Platform.Threading/ConcurrentQueueExtensions.cs b/csharp/Platform.Threading/ConcurrentQueueExtensions.cs deleted file mode 100644 index c646354..0000000 --- a/csharp/Platform.Threading/ConcurrentQueueExtensions.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using Platform.Collections.Concurrent; - -namespace Platform.Threading -{ - /// - /// Provides a set of extension methods for objects. - /// Предоставляет набор методов расширения для объектов . - /// - public static class ConcurrentQueueExtensions - { - /// - /// Suspends evaluation of the method until all asynchronous operations in the queue finish. - /// Приостановляет выполнение метода до завершения всех асинхронных операций в очереди. - /// - /// The queue of asynchronous operations.Очередь асинхронных операций. - /// An asynchronous operation representation.Представление асинхронной операции. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static async Task AwaitAll(this ConcurrentQueue queue) - { - foreach (var item in queue.DequeueAll()) - { - await item.ConfigureAwait(continueOnCapturedContext: false); - } - } - - /// - /// Suspends evaluation of the method until the first asynchronous operation in the queue finishes. - /// Приостанавливает выполнение метода до завершения первой асинхронной операции в очереди. - /// - /// The queue of asynchronous operations.Очередь асинхронных операций. - /// An asynchronous operation representation.Представление асинхронной операции. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static async Task AwaitOne(this ConcurrentQueue queue) - { - if (queue.TryDequeue(out Task item)) - { - await item.ConfigureAwait(continueOnCapturedContext: false); - } - } - - /// - /// Adds an as runned to the end of the . - /// Добавляет как запущенную в конец . - /// - /// The queue of asynchronous operations.Очередь асинхронных операций. - /// The delegate.Делагат . - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void RunAndPush(this ConcurrentQueue queue, Action action) => queue.Enqueue(Task.Run(action)); - } -} diff --git a/csharp/Platform.Threading/Platform.Threading.csproj b/csharp/Platform.Threading/Platform.Threading.csproj index b9d11b2..f0279bf 100644 --- a/csharp/Platform.Threading/Platform.Threading.csproj +++ b/csharp/Platform.Threading/Platform.Threading.csproj @@ -9,7 +9,7 @@ net8 Platform.Threading Platform.Threading - LinksPlatform;Threading;ISynchronization;ISynchronizationExtensions;ISynchronized;ReaderWriterLockSynchronization;Unsynchronization;ConcurrentQueueExtensions;TaskExtensions;ThreadHelpers + LinksPlatform;Threading;ISynchronization;ISynchronizationExtensions;ISynchronized;ReaderWriterLockSynchronization;Unsynchronization;TaskExtensions;ThreadHelpers https://raw.githubusercontent.com/linksplatform/Documentation/18469f4d033ee9a5b7b84caab9c585acab2ac519/doc/Avatar-rainbow-icon-64x64.png https://linksplatform.github.io/Threading Unlicense diff --git a/experiments/simple_comparison.cs b/experiments/simple_comparison.cs new file mode 100644 index 0000000..14fe7c5 --- /dev/null +++ b/experiments/simple_comparison.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Concurrent; +using System.Threading.Tasks; +using System.Linq; + +/// +/// Simple comparison of sequential await vs Task.WaitAll +/// +class Program +{ + static void Main(string[] args) + { + Console.WriteLine("=== Task Comparison Analysis ==="); + + Console.WriteLine("\nCurrent ConcurrentQueueExtensions.AwaitAll approach:"); + Console.WriteLine("- Awaits tasks SEQUENTIALLY using foreach"); + Console.WriteLine("- If you have 3 tasks that take 100ms each, total time = 300ms"); + Console.WriteLine("- Poor performance for parallel operations"); + + Console.WriteLine("\nTask.WaitAll approach:"); + Console.WriteLine("- Waits for all tasks to complete IN PARALLEL"); + Console.WriteLine("- If you have 3 tasks that take 100ms each, total time = ~100ms"); + Console.WriteLine("- Better performance - this is the standard .NET pattern"); + + Console.WriteLine("\nConclusion:"); + Console.WriteLine("✓ Task.WaitAll is the standard .NET way to wait for multiple tasks"); + Console.WriteLine("✓ Much better performance (parallel vs sequential)"); + Console.WriteLine("✓ ConcurrentQueueExtensions promotes worse design patterns"); + Console.WriteLine("✓ Should be removed as suggested in issue #25"); + + Console.WriteLine("\nRecommended pattern instead of ConcurrentQueueExtensions:"); + Console.WriteLine(" var tasks = new List();"); + Console.WriteLine(" tasks.Add(SomeAsyncMethod());"); + Console.WriteLine(" tasks.Add(AnotherAsyncMethod());"); + Console.WriteLine(" Task.WaitAll(tasks.ToArray());"); + } +} \ No newline at end of file diff --git a/experiments/task_waitall_comparison.cs b/experiments/task_waitall_comparison.cs new file mode 100644 index 0000000..859a837 --- /dev/null +++ b/experiments/task_waitall_comparison.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Concurrent; +using System.Threading.Tasks; +using System.Linq; + +namespace ExperimentComparison +{ + /// + /// Experiment to compare ConcurrentQueueExtensions.AwaitAll vs Task.WaitAll approaches + /// + class TaskWaitAllComparison + { + static async Task Main(string[] args) + { + Console.WriteLine("Comparing ConcurrentQueueExtensions.AwaitAll vs Task.WaitAll"); + + // Create some sample tasks + var queue = new ConcurrentQueue(); + queue.Enqueue(Task.Delay(100)); + queue.Enqueue(Task.Delay(200)); + queue.Enqueue(Task.Delay(150)); + + // Current approach with ConcurrentQueueExtensions.AwaitAll + Console.WriteLine("\n--- Current Approach (ConcurrentQueueExtensions.AwaitAll) ---"); + var start1 = DateTime.Now; + + // Simulate the AwaitAll behavior + foreach (var item in queue.ToArray()) // DequeueAll equivalent + { + await item.ConfigureAwait(false); + } + + var duration1 = DateTime.Now - start1; + Console.WriteLine($"Sequential await duration: {duration1.TotalMilliseconds}ms"); + + // Alternative approach with Task.WaitAll + Console.WriteLine("\n--- Alternative Approach (Task.WaitAll) ---"); + var queue2 = new ConcurrentQueue(); + queue2.Enqueue(Task.Delay(100)); + queue2.Enqueue(Task.Delay(200)); + queue2.Enqueue(Task.Delay(150)); + + var start2 = DateTime.Now; + Task.WaitAll(queue2.ToArray()); + var duration2 = DateTime.Now - start2; + Console.WriteLine($"Parallel wait duration: {duration2.TotalMilliseconds}ms"); + + Console.WriteLine("\n--- Analysis ---"); + Console.WriteLine("Current AwaitAll approach: Awaits tasks sequentially (worse performance)"); + Console.WriteLine("Task.WaitAll approach: Waits for all tasks in parallel (better performance)"); + Console.WriteLine($"Performance difference: {duration1.TotalMilliseconds - duration2.TotalMilliseconds}ms"); + } + } +} \ No newline at end of file