Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Platform.Threading.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
<AssemblyTitle>Platform.Threading</AssemblyTitle>
<VersionPrefix>0.1.1</VersionPrefix>
<Authors>Konstantin Diachenko</Authors>
<TargetFrameworks>net472;netstandard2.0;netstandard3.1;net5;net6</TargetFrameworks>
<TargetFramework>net8</TargetFramework>
<AssemblyName>Platform.Threading</AssemblyName>
<PackageId>Platform.Threading</PackageId>
<PackageTags>LinksPlatform;Threading;ISynchronization;ISynchronizationExtensions;ISynchronized;ReaderWriterLockSynchronization;Unsynchronization;ConcurrentQueueExtensions;TaskExtensions;ThreadHelpers</PackageTags>
<PackageTags>LinksPlatform;Threading;ISynchronization;ISynchronizationExtensions;ISynchronized;ReaderWriterLockSynchronization;Unsynchronization;TaskExtensions;ThreadHelpers</PackageTags>
<PackageIconUrl>https://raw.githubusercontent.com/linksplatform/Documentation/18469f4d033ee9a5b7b84caab9c585acab2ac519/doc/Avatar-rainbow-icon-64x64.png</PackageIconUrl>
<PackageProjectUrl>https://linksplatform.github.io/Threading</PackageProjectUrl>
<PackageLicenseExpression>Unlicensed</PackageLicenseExpression>
Expand Down
23 changes: 0 additions & 23 deletions cpp/Platform.Threading/ConcurrentQueueExtensions.h

This file was deleted.

54 changes: 0 additions & 54 deletions csharp/Platform.Threading/ConcurrentQueueExtensions.cs

This file was deleted.

2 changes: 1 addition & 1 deletion csharp/Platform.Threading/Platform.Threading.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<TargetFramework>net8</TargetFramework>
<AssemblyName>Platform.Threading</AssemblyName>
<PackageId>Platform.Threading</PackageId>
<PackageTags>LinksPlatform;Threading;ISynchronization;ISynchronizationExtensions;ISynchronized;ReaderWriterLockSynchronization;Unsynchronization;ConcurrentQueueExtensions;TaskExtensions;ThreadHelpers</PackageTags>
<PackageTags>LinksPlatform;Threading;ISynchronization;ISynchronizationExtensions;ISynchronized;ReaderWriterLockSynchronization;Unsynchronization;TaskExtensions;ThreadHelpers</PackageTags>
<PackageIconUrl>https://raw.githubusercontent.com/linksplatform/Documentation/18469f4d033ee9a5b7b84caab9c585acab2ac519/doc/Avatar-rainbow-icon-64x64.png</PackageIconUrl>
<PackageProjectUrl>https://linksplatform.github.io/Threading</PackageProjectUrl>
<PackageLicenseExpression>Unlicense</PackageLicenseExpression>
Expand Down
37 changes: 37 additions & 0 deletions experiments/simple_comparison.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
using System.Linq;

/// <summary>
/// Simple comparison of sequential await vs Task.WaitAll
/// </summary>
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<Task>();");
Console.WriteLine(" tasks.Add(SomeAsyncMethod());");
Console.WriteLine(" tasks.Add(AnotherAsyncMethod());");
Console.WriteLine(" Task.WaitAll(tasks.ToArray());");
}
}
54 changes: 54 additions & 0 deletions experiments/task_waitall_comparison.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
using System.Linq;

namespace ExperimentComparison
{
/// <summary>
/// Experiment to compare ConcurrentQueueExtensions.AwaitAll vs Task.WaitAll approaches
/// </summary>
class TaskWaitAllComparison
{
static async Task Main(string[] args)
{
Console.WriteLine("Comparing ConcurrentQueueExtensions.AwaitAll vs Task.WaitAll");

// Create some sample tasks
var queue = new ConcurrentQueue<Task>();
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<Task>();
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");
}
}
}
Loading