如何让多个线程处理相同的IEnumerable结果?

esa*_*sac 8 c# ienumerable task

我有一个方法,它返回一个IEnumerable<string>当然正在处理的方法yield return <string>;.我希望有多个线程处理这个结果,当然不重复它并且是线程安全的.我怎么做到这一点?

var result = GetFiles(source);

for (int i = 0; i < Environment.ProcessorCount; i++)
{
    tasks.Add(Task.Factory.StartNew(() => { ProcessCopy(result); }));
}

Task.WaitAll(tasks.ToArray());
Run Code Online (Sandbox Code Playgroud)

然而,这似乎产生了重复:

C:\Users\esac\Pictures\2000-06\DSC_1834.JPG
C:\Users\esac\Pictures\2000-06\DSC_1835.JPG
C:\Users\esac\Pictures\2000-06\.picasa.ini
C:\Users\esac\Pictures\2000-06\DSC_1834.JPG
C:\Users\esac\Pictures\2000-06\DSC_1835.JPG
C:\Users\esac\Pictures\2000-06\.picasa.ini
C:\Users\esac\Pictures\2000-06\DSC_1834.JPG
C:\Users\esac\Pictures\2000-06\DSC_1835.JPG
C:\Users\esac\Pictures\2000-06\.picasa.ini
C:\Users\esac\Pictures\2000-06\DSC_1834.JPG
C:\Users\esac\Pictures\2000-06\DSC_1835.JPG
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 9

您可以使用Parallel.ForEach方法轻松完成此操作.

编写一个简单的Parallel.ForEach循环

每次迭代都将在任务管理器中排队.执行所有迭代时,循环将退出.

var result = GetFiles(source);

Parallel.ForEach(result, current => {
    ProcessCopy(current);
});

Console.WriteLine("Done");
Run Code Online (Sandbox Code Playgroud)