C# 并行。如果loopcount为1,则该操作失败

C# 并行。如果loopcount为1,则该操作失败,c#,parallel-processing,C#,Parallel Processing,我有以下代码;虽然结果与非并行版本不一致,但它在较大的循环计数上执行,但如果循环计数为1,它将失败。我的比例尺怎么了?为什么 我正在计算约1000只股票与约500只指数的相关系数;随着时间的推移,每个都有大约250个测量值。每个股票(目标)与每个指数(测试)相关。目标循环是串行的,我想并行地执行测试循环,因为对于每个测试,目标数据都是相同的 在方法DoOneTest中,针对这一个目标的一个测试计算相关性,并使用两个索引和一个目标数据数组调用它,该数组表示所有测试的恒定目标数据 teststart

我有以下代码;虽然结果与非并行版本不一致,但它在较大的循环计数上执行,但如果循环计数为1,它将失败。我的比例尺怎么了?为什么

我正在计算约1000只股票与约500只指数的相关系数;随着时间的推移,每个都有大约250个测量值。每个股票(目标)与每个指数(测试)相关。目标循环是串行的,我想并行地执行测试循环,因为对于每个测试,目标数据都是相同的

在方法DoOneTest中,针对这一个目标的一个测试计算相关性,并使用两个索引和一个目标数据数组调用它,该数组表示所有测试的恒定目标数据

teststart = 0;
UserUnique.TestRank = 1; //# of tests
var options = new ParallelOptions { MaxDegreeOfParallelism = 1 };
Parallel.For(teststart, UserUnique.TestRank - 1, options, paralleltestcounter =>
{
      int testindex = paralleltestcounter;
      UserUnique.outputGrid = DoOneTest(tgtindx, testindex, x);
 });

它失败,因为循环计数设置为1,然后从中减去1:

UserUnique.TestRank = 1; //# of tests
Parallel.For(teststart, UserUnique.TestRank - 1, options, paralleltestcounter =>
因此,您的
from inclusive
to exclusive
都是
0
,因此循环永远不会进入。将循环更改为:

Parallel.For(teststart, UserUnique.TestRank, options, paralleltestcounter =>
更多信息


另见@juharr评论:


首先,将
MaxDegreeOfParallelism
设置为1似乎无法达到使用Parallel.For的目的


它失败,因为循环计数设置为1,然后从中减去1:

UserUnique.TestRank = 1; //# of tests
Parallel.For(teststart, UserUnique.TestRank - 1, options, paralleltestcounter =>
因此,您的
from inclusive
to exclusive
都是
0
,因此循环永远不会进入。将循环更改为:

Parallel.For(teststart, UserUnique.TestRank, options, paralleltestcounter =>
更多信息


另见@juharr评论:


首先,将
MaxDegreeOfParallelism
设置为1似乎无法达到使用Parallel.For的目的


首先,将
MaxDegreeOfParallelism
设置为1似乎无法达到使用
Parallel.For
的目的。我注意到您有不接受对您有帮助的答案的历史记录,为此,请导航到有用的答案,然后单击帖子分数和上/下投票按钮下方的勾号。勾号将变为绿色,让您知道它起作用了。在该区域,您还可以对答案进行上/下投票。这有助于其他人了解此信息是否有帮助。感谢您告诉我如何回复!谢谢你的回答;我假设它会像在顺序情况下一样执行一个循环。@petergregory在顺序情况下
for(int I=0;I<0;++I)
循环也永远不会进入。将
MaxDegreeOfParallelism
设置为1似乎无法达到使用
Parallel的目的。首先,对于
。我注意到您有不接受对您有帮助的答案的历史记录,要执行此操作,请导航到有帮助的答案,然后单击帖子得分和上/下投票按钮下方的勾号。勾号将变为绿色,让您知道它起作用了。在该区域,您还可以对答案进行上/下投票。这有助于其他人了解此信息是否有帮助。感谢您告诉我如何回复!谢谢你的回答;我曾假设它会像在顺序情况下一样执行一个循环。@petergregory在顺序情况下
for(int I=0;I<0;++I)
循环也不会进入。juharr,测试并行代码的一个简单方法是,当你关闭并行时,看看它是否给出与串行版本相同的结果。juharr,测试并行代码的一种简单方法是,当你关闭并行时,看看它是否给出与串行版本相同的结果。没有。