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