使用并行线程时,应用程序卡住了

时间:2012-12-14 23:04:14

标签: c# parallel-processing

我正致力于改进数据库同步应用程序,该应用程序需要同时处理数百万条记录。我将使用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);
   }
}

1 个答案:

答案 0 :(得分: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();在类级别的方法之外。