我有一些如下形式的代码:
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
}
问题是,如果我不控制线程,事情就会开始崩溃。现在,我想启动最多throttle
个线程,并且只有当旧线程完成时才启动新线程。我尝试了一些方法,但到目前为止没有任何方法可以解决问题。我遇到的问题包括:
tasks
集合必须完全填充所有任务,无论是活动的还是等待执行的,否则最终的.Wait()
调用只会查看它启动的线程。- 链接执行似乎需要使用
Task.Run()
或类似的方法。 但是我需要从一开始就对每个任务有一个引用,而实例化任务似乎会自动启动它,这正是我不想要的。
如何做到这一点?