Partition TPL Tasks in ASP.NET 4.0 for WCF Service
Specification

There are a couple of strategies available to you depending on what exactly you mean with 


  "not spinning up too many concurrent tasks"


Possible Strategies


If you want a maximum allowed number of tasks to be processed concurrently on the server, regardless of this method, assuming you are using the default task scheduler, you can set the maximum number of threads of the .NET ThreadPool.
If you want a maximum allowed number of tasks to be processed concurrently for this given scenario, leaving the other task scheduling on the server alone, you can:


implement a custom TaskScheduler with its own dedicated thread pool. In .NET Framework you might also implement a custom SynchronizationContext instead. It's a lower level than the scheduler and you can always create a TaskScheduler.FromCurrentSynchronizationContext();.
use a SemaphoreSlim to limit the number of tasks that actually perform work concurrently. Note that this could still lead to more threads than your threshold to be activated, however, only the specified threshold amount of threads would actually be performing work.
Use JanDotNet's Parallel with MaxDegreeOfParallelism approach within a single Task. Note that this changes the affinity from threads to processors. Not sure whether this is what you are looking for. But at least it's a possibility, and non-blocking because wrapped inside a Task.