小编Mik*_*ike的帖子

为什么在Parallel.ForEach中每个线程多次调用localInit Func

我正在编写一些代码来处理大量数据,我认为让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)

.net c# task-parallel-library .net-4.5

7
推荐指数
1
解决办法
1253
查看次数

标签 统计

.net ×1

.net-4.5 ×1

c# ×1

task-parallel-library ×1