c# - 使用并行线程时,应用程序卡住

标签 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);
   }
}

最佳答案

这是您的代码示例:

    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(); 在类级别的方法之外。

关于c# - 使用并行线程时,应用程序卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13887465/

相关文章:

c# - CS0029 C# 无法将类型 'void' 隐式转换为 'System.EventHandler'

java - 并发执行 : Future vs parallelstream

.net - 我可以异步运行 Seq.iter 的 Action 函数吗

c# - 隐藏派生类的属性

c# - 从 Entity Framework 中的实体获取 DbContext

multithreading - SMP 并行的内存管理瓶颈

methods - 求解线性方程组的并行迭代算法

c++ - 有没有办法在 C/C++ 中并行运行完全不相关的任务

c# - 泛型类型参数中的多态性

c# - 在派生类中通过 .NET 反射调用 protected 泛型方法