【发布时间】:2015-11-09 21:27:14
【问题描述】:
我有一些如下形式的代码:
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()等。但是我从一开始就需要对每个任务的引用,并且实例化一个任务似乎会自动启动它,这是我不想要的。
如何做到这一点?
【问题讨论】:
-
可能会在列表中添加一定数量的
throttle任务并每次运行它们。 -
@CliveDM 我不清楚你的意思。也许用一些示例代码发布答案?
标签: c# asynchronous async-await task-parallel-library