diff --git a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs index 58f094e..e607542 100644 --- a/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs +++ b/PerfectNumbers.Core/MersenneNumberDivisorByDivisorTester.cs @@ -253,7 +253,8 @@ public static class MersenneNumberDivisorByDivisorTester { ParallelOptions options = new() { - MaxDegreeOfParallelism = workerCount + MaxDegreeOfParallelism = workerCount, + TaskScheduler = UnboundedTaskScheduler.Instance }; Parallel.ForEach(filteredPrimes, options, ProcessPrime); diff --git a/PerfectNumbers.Core/UnboundedTaskScheduler.cs b/PerfectNumbers.Core/UnboundedTaskScheduler.cs new file mode 100644 index 0000000..40a10e6 --- /dev/null +++ b/PerfectNumbers.Core/UnboundedTaskScheduler.cs @@ -0,0 +1,34 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace PerfectNumbers.Core; + +public sealed class UnboundedTaskScheduler : TaskScheduler +{ + public static UnboundedTaskScheduler Instance { get; } = new(); + + private UnboundedTaskScheduler() + { + } + + public override int MaximumConcurrencyLevel => int.MaxValue; + + protected override void QueueTask(Task task) + { + ThreadPool.UnsafeQueueUserWorkItem(static state => + { + (UnboundedTaskScheduler Scheduler, Task Task) tuple = ((UnboundedTaskScheduler, Task))state!; + tuple.Scheduler.TryExecuteTask(tuple.Task); + }, (this, task)); + } + + protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) + { + return TryExecuteTask(task); + } + + protected override IEnumerable? GetScheduledTasks() + { + return null; + } +}