在C#(.NET)中,我得到了2个循环 - >
A for ... do:
{
B for do:
{ something}
something that evaluates all "for"s in B loop
}
我使用Parallel.For作为内部循环,但每次运行应用程序时这些循环的结果都不同。我认为这可能是一些异步工作的结果,但我不确定如何在VS 2005 Express中确定它,而且我不确定如果我应该做的事情就像“等到Parallel.For结束了,然后为所有这些做点什么。
编辑(由于评论要求提供更具体的信息):
for (int i = 0; i < max; i++) //Pre Vsetky retazce ..
{
prefix = 0;
tempsame.Clear();
bool spracovane = true;
int dlzkaI = Items[i, 1].Length;
if (Items[i, 2] != "1") { spracovane = false; }
if (spracovane == false)
// Parallel.For(0, max, delegate(int j)
// {
for (int j = 0; j < max; j++) //Pre kazdy dalsi
{
int dlzkaJ = Items[j, 1].Length;
if (dlzkaJ >= dlzkaI)
{
CompareInfo myComp = CultureInfo.InvariantCulture.CompareInfo;
bool isprefix = myComp.IsPrefix(Items[j, 1], Items[i, 1]);
bool issame = false;
if (dlzkaJ.Equals(dlzkaI)) issame = true;
if (isprefix == true && issame == false)
{
prefix++;
}
else if (isprefix == true && issame == true && prefix == 0)
{
tempsame.Add(Items[j, 0]);
}
}
}
if ((prefix==0) && (spracovane==false))
{
Items = UpdateUnique(tempsame.ToArray(typeof(string)) as string[], Items);
unique++;
}
}
简而言之,2个循环遍历相同的字符串数组,并且只选择唯一的字符串 - &gt;这意味着该字符串不能是任何其他字符串的前缀。
> Car - unique Car - unique Cafeteria -
> unique Automobile - unique Auto - not
> unique - it's prefix of Automobile
> Auto - not unique
答案 0 :(得分:1)
如果你的两个看起来与外部变量或副作用有交互,那么你的结果可能最终是非确定性的。这是一个解释,你应该检查这些看起来是否有互动。看看你的循环是如何插入,考虑只在外循环上做Parallel.For
。
另一个解释可能是PFX还不是一个稳定的技术 - 它会产生许多奇怪的错误,所以我会等待.NET 4 / VS 2010并使用它们。
哦,如果你正在做一些数学算法并想要绝对的顶级性能,我根本就不会使用.NET - OpenMP更好,更不用说线程构建模块等了。
祝你好运!答案 1 :(得分:1)
在没有详细研究代码的情况下,有一个明显的潜在问题,即内部Parallel.For
循环递增并检查在并行循环外声明的prefix
变量。
这意味着并行迭代可能会有不同的功能,具体取决于哪个线程首先递增此变量。