using System.Collections.Generic;
using System.Threading.Tasks;
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}]" +
(Thread.CurrentThread.IsBackground ? ", Background" : "") +
(Thread.CurrentThread.IsThreadPoolThread ? ", ThreadPool" : ""));
public class ThreadPerTask_TaskScheduler : TaskScheduler
protected override void QueueTask(Task task)
var thread = new Thread(() => TryExecuteTask(task));
thread.IsBackground = true;
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
return TryExecuteTask(task);
protected override IEnumerable<Task> GetScheduledTasks() { yield break; }