Create TPL Task for each calculation, and start them, internally each task will be queued and will execute when threads get available, thus you don't have to bother about thread management, it will be handled internally.
if you want to limit maximum parallel task to execute at a time you can use Parallel.Invoke method and set MaxDegreeOfParallelism
e.g.
Parallel.Invoke(
new ParallelOptions() { MaxDegreeOfParallelism = 3 },
() => Calculation1(),
() => Calculation2(),
() => Calculation3(),
);
Parallel.Invoke takes an array of parameters and perform action on it to run them all in parallel, at the same time you can set MaxDegreeOfParallelism to set maximum number of calculations to be run at a time.
e.g.
I suppose you have same method (Calculate) but multiple parameters (Parameters) as input.
Parallel.ForEach(Parameters,new ParallelOptions() { MaxDegreeOfParallelism = 3 }, parameter=> Calculate(parameter));