How can I force TPL to use a fixed number of threads? I know MaxDegreeOfParallelism can be used to set the upper limit, but I want the upper limit to equal the lower limit.
You could create your own TaskScheduler if you really needed to, but using TaskCreationOptions.LongRunning is probably the best approach.
How to: Create a Task Scheduler That Limits the Degree of Concurrency
Have you tried using TaskCreationOptions.LongRunning when creating the tasks? It's only a hint, but I believe it may help:
Specifies that a task will be a long-running, coarse-grained operation. It provides a hint to the TaskScheduler that oversubscription may be warranted.
It's possible that that will oversubscribe it beyond MaxDegreeOfParallelism of course... you should probably try to find a resource which explains it in detail. How are you creating your tasks, by the way?