.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
	public static void Main()
	{
        var parallelOptions = new ParallelOptions()
        {
            MaxDegreeOfParallelism = 3,
            TaskScheduler = new ThreadPerTask_TaskScheduler()
        };
        Parallel.ForEach(Enumerable.Range(1, 10), parallelOptions, item =>
        {
            Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}" +
                $" [{Thread.CurrentThread.ManagedThreadId}]" +
                $" Processing #{item}" +
                (Thread.CurrentThread.IsBackground ? ", Background" : "") +
                (Thread.CurrentThread.IsThreadPoolThread ? ", ThreadPool" : ""));
            Thread.Sleep(500); // Simulate CPU-bound work
        });
	}

    public class ThreadPerTask_TaskScheduler : TaskScheduler
    {
        protected override void QueueTask(Task task)
        {
            var thread = new Thread(() => TryExecuteTask(task));
            thread.IsBackground = true;
            thread.Start();
        }

        protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
        {
            return TryExecuteTask(task);
        }

        protected override IEnumerable<Task> GetScheduledTasks() { yield break; }
    }
}
;