C# 如何通过不同范围的并行。为?
我需要通过发送skip-take count(如1-1000、1001-20002001-3000等)并行处理单个文件 并行处理代码C# 如何通过不同范围的并行。为?,c#,parallel-processing,plinq,parallel-extensions,C#,Parallel Processing,Plinq,Parallel Extensions,我需要通过发送skip-take count(如1-1000、1001-20002001-3000等)并行处理单个文件 并行处理代码 var line = File.ReadAllLines("D:\\OUTPUT.CSV").Length; Parallel.For(1, line, new ParallelOptions { MaxDegreeOfParallelism = 10 }, x => { DoSomething(skip,take); });
var line = File.ReadAllLines("D:\\OUTPUT.CSV").Length;
Parallel.For(1, line, new ParallelOptions { MaxDegreeOfParallelism = 10 }, x
=> {
DoSomething(skip,take);
});
作用
public static void DoSomething(int skip, int take)
{
//code here
}
如何按照我的要求在并行过程中发送
跳过和进行计数?使用PLINQ您可以很容易地完成这些操作。如果希望批量为1000,可以执行以下操作:
const int BatchSize = 1000;
var pageAmount = (int) Math.Ceiling(((float)lines / BatchSize));
var results = Enumerable.Range(0, pageAmount)
.AsParallel()
.Select(page => DoSomething(page));
public void DoSomething(int page)
{
var currentLines = source.Skip(page * BatchSize).Take(BatchSize);
// do something with the selected lines
}
谢谢,但是Enumerable.Range(1,pageAmount)
应该是Enumerable.Range(0,pageAmount-1)
对吗?在方法DoSomething
中,我们第一次只得到page=1,对吗?因此source.Skip(page*BatchSize).Take(BatchSize)
将成为source.Skip(1000).Take(1000)。因此,第一次它本身将跳过1000行hanks,我认为需要更改结束范围,即pageAmount
到pageAmount-1
我们跳过4000行,然后取1000行,这意味着我们取的是最后一批,即4001-5000行,因此它应该pageAmount-1
我无法理解你的观点,行数=5000,然后pageAmount=5,它从0开始迭代,5-1意味着总共5次迭代,即0,1,2,3,4,因此每次迭代上的行过程是1-10001001-20002001-300011-40004001-5000,因此所有行都被处理,如果我错了,请纠正我。