3

一度に何百万ものレコードを操作する必要があるデータベース同期アプリケーションの改善に取り組んでいます。SqlBulkCopy操作を採用MERGEし、データベースで使用して一時テーブルを現在のテーブルとマージします。しかしその前に、データベースに追加するいくつかのテーブルを作成します。通常のループを使用すると問題なく動作しますが、Parallel.ForEachループを作成すると、約 100 レコードを処理した後でハングします。エラーも何もありません...何らかのしきい値に達していると思いますが、それを処理する方法がわかりません。2 つの並列スレッドを選択すると正常に動作しますが、2 つ以上のスレッドでエラーが発生しません。

DataTable PRODUCT = new DataTable();

ParallelOptions parOptions = new ParallelOptions();
parOptions.MaxDegreeOfParallelism = 5; //use max (5) threads that are allowed.
Parallel.ForEach(dtPs.AsEnumerable(), parOptions, dtPs_row =>
{
   try
   { 
      //some declarations
      DataRow newProductRow = PRODUCT.NewRow();
      newProductRow.SetField("ID", mId);
      newProductRow.SetField("NAME", name);
      PRODUCT.Rows.Add(newProductRow);
   }
}
4

1 に答える 1

1

コードの例を次に示します。

    DataTable PRODUCT = new DataTable();
    Object lockobj = new Object();


    ParallelOptions parOptions = new ParallelOptions();
    parOptions.MaxDegreeOfParallelism = 5; //use max (5) threads that are allowed.
    Parallel.ForEach(dtPs.AsEnumerable(), parOptions, dtPs_row =>
    {
        try
        { 
            //some declarations
            lock(lockobj)
            {
                DataRow newProductRow = PRODUCT.NewRow();
                newProductRow.SetField("ID", mId);
                newProductRow.SetField("NAME", name);
                PRODUCT.Rows.Add(newProductRow);
            }
        }
    }

Object lockobj = new Object();それがクラスレベルでメソッドの外にあると仮定します。

于 2012-12-14T23:27:50.293 に答える