Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When using parallel threads, application getting stuck

I am working on improving database synchronization application that requires to work with millions of records at the time. I will employ SqlBulkCopy operation and then will use MERGE on the database to merge temporary tables with current tables. But before that I create couple tables that I will add to the database. When I use regular loops, it works fine, but when I create Parallel.ForEach loops, it processes around 100 records and then just hangs. No errors, no nothing... I assume it is hitting some sort of threshold, but don't know how to handle it. When I select 2 parallel threads, it works fine, but it is getting stuck with > 2 threads without any errors.

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);
   }
}
like image 965
Andrew Avatar asked Jul 19 '26 01:07

Andrew


1 Answers

Here is an example with your code:

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

Assuming that Object lockobj = new Object(); is outside the method at the class level.

like image 185
jmrnet Avatar answered Jul 20 '26 16:07

jmrnet



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!