C# 为什么不执行索引较低的迭代?
代码成功地构建了无编译错误,但在运行时没有任何迭代。IC# 为什么不执行索引较低的迭代?,c#,asynchronous,parallel.foreach,C#,Asynchronous,Parallel.foreach,代码成功地构建了无编译错误,但在运行时没有任何迭代。I在200停止了循环迭代,因此循环不会继续进行,但循环不会执行低于
在200停止了循环迭代
,因此循环不会继续进行,但循环不会执行低于<200
的迭代
我不确定我可以使用Stop的任何替代方法来修复此代码吗?
为什么不执行索引较低的迭代
如何解决这个问题。我用谷歌搜索了一些东西,但都是徒劳的。
请考虑以下代码。
static void Main(string[] args)
{
var values= Enumerable.Range(0, 500).ToArray();
ParallelLoopResult result = Parallel.For(0, values.Count(),
(int i, ParallelLoopState loopState) => {
if (i == 200)
loopState.Stop();
WorkOnItem(values[i]);
});
Console.WriteLine(result);
}
static void WorkOnItem(object value) {
System.Console.WriteLine("Started working on: " + value);
Thread.Sleep(100);
System.Console.WriteLine("Finished working on: " + value); }
如能帮助解决此问题,我们将不胜感激。谢谢您应该调用loopState.Break()
而不是loopState.Stop()
从方法的文档中:
Break表示当前迭代之后不应运行任何迭代。它有效地取消了循环的任何附加迭代。但是,它不会停止已经开始执行的任何迭代。例如,如果在从0到1000的并行循环的第100次迭代中调用Break,则所有小于100的迭代仍应运行,但尚未开始的从101到1000的迭代不会执行
您应该调用loopState.Break()
,而不是loopState.Stop()
从方法的文档中:
Break表示当前迭代之后不应运行任何迭代。它有效地取消了循环的任何附加迭代。但是,它不会停止已经开始执行的任何迭代。例如,如果在从0到1000的并行循环的第100次迭代中调用Break,则所有小于100的迭代仍应运行,但尚未开始的从101到1000的迭代不会执行
你忘了添加代码:)如果不看你的代码,不知道到底是什么问题,很难说!您正在迭代哪些元素?预期产量是多少?如何迭代?我投票重新打开,因为OP现在添加了缺少的代码。“我可以使用停止的任何替代方法来修复此代码吗?”不要迭代到values.Count()
,然后停止,迭代到Math.Min(200,values.Count())
停止。你说的是什么意思,但是循环不会执行低于<200的迭代。
?当我尝试你的代码时,我可以看到输出,如开始工作于1…完成工作于1
。你忘了添加代码:)如果没有看到你的代码,很难说问题出在哪里!您正在迭代哪些元素?预期产量是多少?如何迭代?我投票重新打开,因为OP现在添加了缺少的代码。“我可以使用停止的任何替代方法来修复此代码吗?”不要迭代到values.Count()
,然后停止,迭代到Math.Min(200,values.Count())
并停止。您所说的是什么意思,但循环不会执行低于<200的迭代。
?当我尝试您的代码时,我可以看到输出,如开始处理1…完成处理1
。