最简单的解决方案是如果您有 4 个 CPU 内核 - 并行 LINQ +并行度 == 4 将为每个 CPU 内核提供一个线程,否则您必须在线程/任务之间手动分配记录,请参阅以下两种解决方案:
PLINQ 解决方案:
urlTable.Rows.AsParallel().WithDegreeOfParallelism(4)
.Select(....)
手动分发:
您可以使用简单的技巧通过工作线程手动分配项目:N 线程将从N+4
输入列表中获取每个项目,例如:
- 第一个线程:每个
0+4
== 0、3、7...
- 第二:每个
1+4
== 1、4、8 ...
- 第三:每个
2+4
== ...
任务并行库解决方案:
private void ProcessItems(IEnumerable<string> items)
{
// TODO: ..
}
var items = new List<string>(Enumerable.Range(0, 1000)
.Select(i => i + "_ITEM"));
var items1 = items.Where((item, index) => (index + 0) % 4 == 0);
var items2 = items.Where((item, index) => (index + 1) % 4 == 0);
var items3 = items.Where((item, index) => (index + 2) % 4 == 0);
var items4 = items.Where((item, index) => (index + 3) % 4 == 0);
var tasks = new Task[]
{
factory.StartNew(() => ProcessItems((items1))),
factory.StartNew(() => ProcessItems((items2))),
factory.StartNew(() => ProcessItems((items3))),
factory.StartNew(() => ProcessItems((items4)))
};
Task.WaitAll(tasks);
MSDN: