2

我有一个产生线程的for循环......我希望它产生5个线程然后等到它下降到4个然后产生另一个。

基本上,如果我有 100 条记录,我想一次处理 5 条。哪个是首选方法?

4

2 回答 2

7

首选方法可能是为此仅使用其中一种内置机制。

例如,Parallel.ForEach可以选择指定要使用的MaxDegreeOfParallelism,它对应于使用的最大线程数。

这会让你只写如下内容:

var options = new ParallelOptions { MaxDegreeOfParallelism = 5 };
Parallel.ForEach(records, options, rec =>
{
    ProcessRecord(rec);
});

如果您的“记录处理”是映射或查询操作,另一个不错的选择是使用 PLINQ 的WithDegreeOfParallelism来限制并行度:

var results = records.AsParallel().WithDegreeOfParallelism(5).Select(r => ProcessRecord(rec)).Where(result => result.Foo); // Some query...

如果您只是“处理”每条记录(即:ProcessRecord 是一个 void 方法),我会选择第一个选项,如果您正在对记录进行某种类型的映射操作或查询,并从记录处理。

于 2012-06-18T20:00:42.747 回答
2

我强烈建议使用ThreadPool或更好的Task Parallel Library (TPL)

于 2012-06-18T20:01:17.723 回答