Use ThreadPool with a limited queue to avoid system overwhelming.
If each of your work tasks is associated with a CPU, then first configure your system so that the number of threads in your system is equal to the number of hardware threads that your box can execute.
If your tasks are not CPU related, you will have to experiment with the pool size to get the best solution for your specific situation.
You may need to experiment with any of these approaches to get to the optimal configuration.
Basically, check, tune, check, repeat until you are happy.