【发布时间】:2014-12-19 21:06:46
【问题描述】:
我已阅读 Microsoft 的运行 Parallel.ForEach loop with thread-local variables 的指南,这对于计数器和/或更新对象很有意义。不过,我的问题是在处理本地布尔变量时需要它。 考虑下面的代码(这只是一个示例,实际代码还有很多功能):
public bool ParallelForEachLoopWithThreadLocalBoolVariable(IEnumerable<string> items)
{
bool doWork = false;
Parallel.ForEach<string, bool>(items,
() => false,
(match, loop, madeChange) =>
{
if (match == "valid")
{
madeChange = true;
ProcessMatch(match);
}
return madeChange;
},
(changed) => doWork = changed
);
return doWork;
}
public bool ParallelForEachLoop(IEnumerable<string> items)
{
bool doWork = false;
Parallel.ForEach(items, match =>
{
if (match == "valid")
{
doWork = true;
ProcessMatch(match);
}
});
return doWork;
}
我的最终目标是传播在ProcessMatch() 方法中完成的工作并返回一个标志,指示整个工作是否有任何不同。
我倾向于使用ParallelForEachLoop 方法,因为我相信ParallelForEachLoopWithThreadLocalBoolVariable 会将布尔值分配给每个分区,如果最后一个分区以错误结束(即匹配!=“有效的”)。
我只是担心局部变量doWork 如果在ParallelForEachLoop 方法中被多个线程访问,可能会引发异常。如果满足条件,我真的只需要设置一次doWork,即使它在整个迭代循环中只发生一次(尽管我肯定需要在每个有效匹配上运行ProcessMatch)。
我的担心有道理吗?我可以使用ParallelForEachLoop 函数而不用担心它在某些情况下可能不起作用吗?
【问题讨论】:
标签: c# .net thread-safety parallel.foreach