I have some code of the following form:
static async Task DoSomething(int n) 
{
  ...
}
static void RunThreads(int totalThreads, int throttle) 
{
  var tasks = new List<Task>();
  for (var n = 0; n < totalThreads; n++)
  {
    var task = DoSomething(n);
    tasks.Add(task);
  }
  Task.WhenAll(tasks).Wait(); // all threads must complete
}
Trouble is, if I don't throttle the threads, things start falling apart.  Now, I want to launch a maximum of throttle threads, and only start the new thread when an old one is complete.  I've tried a few approaches and none so far has worked.  Problems I have encountered include:
- The taskscollection must be fully populated with all tasks, whether active or awaiting execution, otherwise the final.Wait()call only looks at the threads that it started with.
- Chaining the execution seems to require use of Task.Run()or the like. But I need a reference to each task from the outset, and instantiating a task seems to kick it off automatically, which is what I don't want.
How to do this?
 
     
     
     
     
     
     
     
     
    