我有一个产生线程的for循环......我希望它产生5个线程然后等到它下降到4个然后产生另一个。
基本上,如果我有 100 条记录,我想一次处理 5 条。哪个是首选方法?
我有一个产生线程的for循环......我希望它产生5个线程然后等到它下降到4个然后产生另一个。
基本上,如果我有 100 条记录,我想一次处理 5 条。哪个是首选方法?
首选方法可能是为此仅使用其中一种内置机制。
例如,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 方法),我会选择第一个选项,如果您正在对记录进行某种类型的映射操作或查询,并从记录处理。
我强烈建议使用ThreadPool
或更好的Task Parallel Library (TPL)。