C# 打破平行线,foreach?
如何打破循环 我有一个非常复杂的陈述,如下所示:C# 打破平行线,foreach?,c#,multithreading,parallel-processing,parallel.foreach,C#,Multithreading,Parallel Processing,Parallel.foreach,如何打破循环 我有一个非常复杂的陈述,如下所示: Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(), new Action<ColorIndexHolder>((ColorIndexHolder Element) => { if (Element.StartIndex <= I && Element.StartIndex + Element.
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((ColorIndexHolder Element) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
break;
}
}));
使用并行类,到目前为止我可以优化这个过程。然而我不知道如何打破平行循环?休息;语句引发以下语法错误:
没有要中断或继续的封闭循环
您可以使用在循环状态中传递的Parallel.For或Parallel.ForEach重载调用,然后调用或。主要区别在于事物中断的速度有多快——随着中断,循环将处理索引早于当前索引的所有项。停止后,它将尽快退出 有关详细信息,请参阅。使用以下方法: 或者在您的情况下:
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder, ParallelLoopState>((ColorIndexHolder Element, ParallelLoopState state) =>
{
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I)
{
Found = true;
state.Break();
}
}));
只需使用可以提供的loopState
Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),
new Action<ColorIndexHolder>((Element, loopState) => {
if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) {
loopState.Stop();
}
}));
以此为例。您应该使用的是Any,而不是foreach循环:
bool Found = ColorIndex.AsEnumerable().AsParallel()
.Any(Element => Element.StartIndex <= I
&& Element.StartIndex + Element.Length >= I);
任何人都很聪明,只要知道结果一定是真的,就会立即停止。LoopState无疑是一个很好的答案。我发现前面的答案有太多其他东西,很难看到答案,所以这里有一个简单的例子:
using System.Threading.Tasks;
Parallel.ForEach(SomeTable.Rows(), (row, loopState) =>
{
if (row.Value == testValue)
{
loopState.Stop(); // Stop the ForEach!
}
// else do some other stuff here.
});
您是否希望循环的所有并行实例同时中断?完全正确。考虑到一个连续的foreach循环,它保证了无论出于何种原因导致中断的项之前的项都会被处理。那么Parallel.ForEach呢,其中项目的顺序不一定是处理它们的顺序?是否也可以保证IEnumerable中调用state.Break的项之前的所有项都在处理中,而后面的项不在处理中?虽然前者可以通过某种方式实现,但我不认为后者是可能的。@Hendrik Wiese:Docs说:调用Break方法会通知for操作,当前迭代之后的迭代不必执行。但是,如果当前迭代之前的所有迭代尚未执行,则仍必须执行它们。而且也不能保证在当前迭代之后的迭代肯定不会执行。因此会声明。Stop更适合于可靠地实现预期结果,正如Mike Perrenoud和MBentleyIs在下面提到的,是否有比state更直观的变量名?+1,看起来我们中的一些人有着完全相同的答案:-哦,我得到了你对另一个评论人的支持。谢谢你的解释。您是否知道何时调用break或stop,是当前执行的迭代已完成,还是在执行中途停止迭代?@CeejeeB当前正在执行的操作已完成。
using System.Threading.Tasks;
Parallel.ForEach(SomeTable.Rows(), (row, loopState) =>
{
if (row.Value == testValue)
{
loopState.Stop(); // Stop the ForEach!
}
// else do some other stuff here.
});