Taken from Microsoft documentation:
By default, the thread pool has 250 worker threads per available processor. You can change this setting using the ThreadPool.SetMaxThreads method.
It's also said, as it's widely known, that there is some overhead:
Threads have some level of overhead. Therefore, if a computer has multiple processors and you split processing into two threads, you won’t see a 100 percent performance improvement.
Out of some experience and more out of guessing, I'd have had something like 1 to 4 threads per CPU, and not 250! Does someone know why 250? Is it some value that is supposed to give the best overall performance, or is it in order to have pretty much every task you give to that thread pool to be processed without waiting for other tasks to finish?