C# 在C语言中使用并行#

C# 在C语言中使用并行#,c#,foreach,parallel-processing,C#,Foreach,Parallel Processing,我不熟悉线程和并行性。我在C#中有一个游戏的这种方法,需要使用并行迭代。在下面的方法中,我如何在for循环中使用它 public int[,] GetLegalMoves() { int[,] legalMoves = new int[8, 8]; for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) if (IsMoveLegal(i, j)) legalMoves[

我不熟悉线程和并行性。我在C#中有一个游戏的这种方法,需要使用并行迭代。在下面的方法中,我如何在for循环中使用它

public int[,] GetLegalMoves()
{
    int[,] legalMoves = new int[8, 8];

    for (int i = 0; i < 8; i++)
        for (int j = 0; j < 8; j++)
            if (IsMoveLegal(i, j)) legalMoves[i, j] = 1;
            else legalMoves[i, j] = 0;

    return legalMoves;
}
public int[,]GetLegalMoves()
{
int[,]legalMoves=新int[8,8];
对于(int i=0;i<8;i++)
对于(int j=0;j<8;j++)
如果(IsMoveLegal(i,j))legalMoves[i,j]=1;
else legalMoves[i,j]=0;
归还法律动议;
}

这可以通过并行化外部循环来并行化:

public int[,] GetLegalMoves()
{
    int[,] legalMoves = new int[8, 8];

    Parallel.For(0, 8, i =>
    {
        for (int j = 0; j < 8; j++)
            if (IsMoveLegal(i, j)) legalMoves[i, j] = 1;
            else legalMoves[i, j] = 0;
    });

    return legalMoves;
}
public int[,]GetLegalMoves()
{
int[,]legalMoves=新int[8,8];
对于(0,8,i=>
{
对于(int j=0;j<8;j++)
如果(IsMoveLegal(i,j))legalMoves[i,j]=1;
else legalMoves[i,j]=0;
});
归还法律动议;
}
这就是说,这可能会导致运行速度变慢,因为8x8矩阵是一个非常小的值,因此安排并行工作的开销可能高于获得的收益,除非
IsMoveLegal
是一个相当昂贵的操作


这还要求
IsMoveLegal
可以从多个线程安全使用。

如果要使用PLINQ,则需要使用实现IEnumerable的数据类型。锯齿状
int
阵列不是WTG。你所说的并行是什么意思?这里我看到两个循环nested@Jeremy:这是一个二维数组
[,]
,而不是锯齿状数组
[]]
。首先,为什么需要将其并行?在做任何其他事情之前,首先对其进行分析,并找出是否值得进一步优化。还有,函数IsMoveLegal甚至可以并行执行吗?@Jeremythonpson这不是交错数组,而是二维数组。无论如何,如果您的电路板大小始终为8x8,那么就不用麻烦实现PLINQ/线程/任何东西。即使该阵列为2048x2048,该代码运行速度也非常快。如果你真的想将其并行化,你可以将2D数组展平为1D数组,然后使用PLINQ(但是我从来没有使用过PLINQ,我不知道它是如何工作的,但我认为我刚才描述的方式会工作)感谢这正是我想要的,IsMoveLegal是线程安全的,所以没有问题。非常感谢!