0

私は、私のソフトウェアが週に約 10 回のレポートを作成するために使用する約 3500 の製品シリアル番号のコレクションを持っています。

私のコードは非常にフラットなデータベース (Excel スプレッドシートと考えてください) から取得し、シリアル番号ごとに 1 つのテーブルから 0 から 25 以上のレコードを取得します。このデータをstaticmy のインスタンスを生成するメソッドに渡しCustomClass、それをコレクションに格納して、ルーチンの最後に戻します。

通常、このレポートの実行には約 20 分かかります。その多くは、古いSQL 2000 Serverに送信されるデータ要求によって制限されますが、静的クラスは、できるだけ多くの文字列操作とデータ変換を軽減するために作成されました。

Parallel.Forを記述して、これをさらに高速に実行したいと考えていますが、ルーチンを完了する方法がわかりません。

これが私が今持っているルーチンの簡略化されたバージョンです:

private CustomClass[] Test1(string[] serialNumbers) {
  List<CustomClass> list = new List<CustomClass>();
  for (int i = 0; i < serialNumber.Length; i++) {
    DataTable table = new DataTable();
    using (SqlCommand cmd = new SqlCommand("sp_GetData", m_open_conn)) {
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@sn", SqlDbType.Char, 20).Value = serialNumber[i];
      table.Load(cmd.ExecuteReader());
    }
    list.Add(CustomClass.CreateSummary(table));
  }
  return list.ToArray();
}

タスクは、上記のコードを Parallel.For ループで記述することです。これまでに出くわした例はすべて単純化しすぎており、コードを変換する方法についての洞察は得られません。

これが私がこれまでに持っているものですが、2番目の0値(私のAction / Funcステートメントの値)はCannot implicitly convert type 'int' to 'jp2code.CustomClass'...そして、これを機能させるために正確に何をする必要があるかを知るのに十分理解していません.

private CustomClass[] Test1(string[] serialNumbers) {
  List<CustomClass> list = new List<CustomClass>();
  Parallel.For<CustomClass>(0, serialNumbers.Length, () => 0, (i, loop, list) => {
      DataTable table = new DataTable();
      using (SqlCommand cmd = new SqlCommand("sp_GetData", m_open_conn)) {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@sn", SqlDbType.Char, 20).Value = serialNumber[i];
        table.Load(cmd.ExecuteReader());
      }
    }, (x) => list.Add(CustomClass.CreateSummary(table))
  );
  return list.ToArray();
}

明らかに、配列を何か ( ではない0) で初期化することになっていますが、ここで正確に何をすべきかわかりません。

誰か助けてくれませんか?

4

2 に答える 2

2

シリアル番号の固定セットが既にあるので、実際には必要ありませんParallel.For

PLINQ を使用できます。

return serialNumbers.AsParallel().Select(number => { ...get table... }).ToArray();

ToArray()ただし、このアプローチはあまりお勧めしません。

于 2012-07-09T19:27:16.473 に答える
1

このブログは、Parallel.For

単純にループを置き換えるには、forこれを行うことができるはずです:

private CustomClass[] Test1(string[] serialNumbers) {
  List<CustomClass> list = new List<CustomClass>();
  Parallel.For(0, serialNumber.Length, (i) => {
    DataTable table = new DataTable();
    using (SqlCommand cmd = new SqlCommand("sp_GetData", m_open_conn)) {
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("@sn", SqlDbType.Char, 20).Value = serialNumber[i];
      table.Load(cmd.ExecuteReader());
    }
    list.Add(CustomClass.CreateSummary(table));
  });
  return list.ToArray();
}
于 2012-07-09T19:31:18.743 に答える