在循环

时间:2017-02-22 07:47:26

标签: c# .net multithreading parallel-processing

我想为单元格运行 Polygonise 并行方法(它们是独立的)。 如果在循环中初始化单元格,如何为单元格创建线程?

  for (int j = 0; j < RowCount - 1; j++)
  {
      for (int k = 0; k < ColumnCount - 1; k++)
      {
          GridCell currentCell = GetCurrentCell (Slice1, Slice2, j, k);
          Polygonise (ref Triangles, int isoLevel, GridCell currentCell);
      }
  }

ADDED :我希望将其传递给GPU,因此Parallel.For和PLinq不合适。问题是:它执行了很长时间,因为 Poligonise 方法中有许多计算,并且有许多行和列(循环参数)。该方法中的操作几乎是快速的,但是这样的循环是耗时的。我需要多线程逻辑。

2 个答案:

答案 0 :(得分:4)

您可以尝试Parallel s:

Parallel.For(0, RowCount, (j) => 
{
    for (int k = 0; k < ColumnCount - 1; k++)
    {
        GridCell currentCell = GetCurrentCell (Slice1, Slice2, j, k);
        // Beware! Possible race condition: 
        // "ref Triangles" is shared reference between threads. 
        Polygonise (ref Triangles, int isoLevel, GridCell currentCell);
    }   
});

PLinq (Parallel Linq):

Enumerable
  .Range(0, RowCount)
  .AsParallel()
  // .WithDegreeOfParallelism(4) // <- if you want to tune PLinq
  .ForAll(j => {
       for (int k = 0; k < ColumnCount - 1; k++)
       {
           GridCell currentCell = GetCurrentCell (Slice1, Slice2, j, k);
           // Beware! Possible race condition: 
           // "ref Triangles" is shared reference between threads. 
           Polygonise (ref Triangles, int isoLevel, GridCell currentCell);
       } 
   });

在这两种情况下,请考虑哪些应并行ColumnsRows

答案 1 :(得分:0)

直接的答案是在需要的地方创建它们并在那里启动它们:

for (int j = 0; j < RowCount - 1; j++)
{
    for (int k = 0; k < ColumnCount - 1; k++)
    {
        GridCell currentCell = GetCurrentCell (Slice1, Slice2, j, k);
        System.Threading.Thread t = new System.Threading.Thread(()=>
        Polygonise (ref Triangles, isoLevel, currentCell));
        t.Start();
    }
}

免责声明:我不知道Triangles是什么以及如何在您的方法中更改它,因此允许许多线程以无序方式更改同一变量可能并不明智。 / p>