我正在编写一些代码来处理大量数据,我认为让Parallel.ForEach为它创建的每个线程创建一个文件是有用的,因此输出不需要同步(至少由我来).
它看起来像这样:
Parallel.ForEach(vals,
new ParallelOptions { MaxDegreeOfParallelism = 8 },
()=>GetWriter(), // returns a new BinaryWriter backed by a file with a guid name
(item, state, writer)=>
{
if(something)
{
state.Break();
return writer;
}
List<Result> results = new List<Result>();
foreach(var subItem in item.SubItems)
results.Add(ProcessItem(subItem));
if(results.Count > 0)
{
foreach(var result in results)
result.Write(writer);
}
return writer;
},
(writer)=>writer.Dispose());
Run Code Online (Sandbox Code Playgroud)
我期望发生的是,最多可以创建8个文件并在整个运行时间内持续存在.然后在整个ForEach调用结束时,每个都将被处理.真正发生的是localInit似乎每个项目都被调用一次,所以我最终得到了数百个文件.作者也被处理在每个处理项目的末尾.
这表明发生了同样的事情:
var vals = Enumerable.Range(0, 10000000).ToArray();
long sum = 0;
Parallel.ForEach(vals,
new ParallelOptions { MaxDegreeOfParallelism = 8 },
() => { …Run Code Online (Sandbox Code Playgroud)