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 回答