2

これは、Parallel.Forについて説明しているMSDNページのサンプルコードです。WinRT C#でも同じことをしたい:

#region Sequential_Loop
static void MultiplyMatricesSequential(double[,] matA, double[,] matB, double[,] result)
{
    int matACols = matA.GetLength(1);
    int matBCols = matB.GetLength(1);
    int matARows = matA.GetLength(0);

    for (int i = 0; i < matARows; i++)
    {
        for (int j = 0; j < matBCols; j++)
        {
            for (int k = 0; k < matACols; k++)
            {
                result[i, j] += matA[i, k] * matB[k, j];
            }
        }
    }
}
#endregion

#region Parallel_Loop

static void MultiplyMatricesParallel(double[,] matA, double[,] matB, double[,] result)
{
    int matACols = matA.GetLength(1);
    int matBCols = matB.GetLength(1);
    int matARows = matA.GetLength(0);

    // A basic matrix multiplication.
    // Parallelize the outer loop to partition the source array by rows.
    Parallel.For(0, matARows, i =>
    {
        for (int j = 0; j < matBCols; j++)
        {
            // Use a temporary to improve parallel performance.
            double temp = 0;
            for (int k = 0; k < matACols; k++)
            {
                temp += matA[i, k] * matB[k, j];
            }
            result[i, j] = temp;
        }
    }); // Parallel.For
}

#endregion

WinRTMetroの同等のintC#は何ですか?

タスクの配列を作成し、配列の完了を待つ必要がありますか?

4

1 に答える 1

3

Metroアプリは、CPUを大量に消費する操作を実行することは想定されていません。アプリストアの要件が何であるかはわかりませんが、かなりの時間CPUを使い果たした場合に、アプリが拒否されても驚かないでしょう。

とはいえ、Metroは並列非同期操作をサポートしており、これを使用して基本的な並列処理を実行できます(必要な場合)。

static async Task MultiplyMatricesAsync(double[,] matA, double[,] matB, double[,] result)
{
  int matACols = matA.GetLength(1);
  int matBCols = matB.GetLength(1);
  int matARows = matA.GetLength(0);

  var tasks = Enumerable.Range(0, matARows).Select(i =>
      Task.Run(() =>
      {
        for (int j = 0; j < matBCols; j++)
        {
          // Use a temporary to improve parallel performance.
          double temp = 0;
          for (int k = 0; k < matACols; k++)
          {
            temp += matA[i, k] * matB[k, j];
          }
          result[i, j] = temp;
        }
      }));
  await Task.WhenAll(tasks);
}
于 2012-06-16T13:55:42.810 に答える