通过并行运行foreach循环来构建结果列表

时间:2012-10-28 01:47:17

标签: c# multithreading parallel-processing

我正在从tblCustomer循环数据并检查地址是否有效。如果没有,那么我将其添加到我的返回列表中。 问题是,有37000行要验证。验证通过外部库完成。这需要大约1小时。我想做这个线程所以我可以更快地做到这一点。 有人可以帮我改写吗?我也读到了某个地方将这个包装在并行类或foreach中。我很想知道几件事 -

  1. 它会创建多少个线程?我们怎么能控制它呢?

  2. 我们可以说每个线程将处理多少条记录?

  3. 我认为最棘手的问题是:这个dll有静态类来验证地址。当我将它分成线程时,是否会给我带来任何性能提升......或者它会花费相同的时间吗?


  4.  List<tblCustomer> customers = new List<tblCustomer>();
                int i = 0;
                foreach (var customer in DataContext.tblCustomers)
                {
                    string addressToValidate = string.Format("{0}, {1}; {2} {3}", GetSafeString(customer.MailingCity), GetSafeString(customer.MailingState), GetSafeString(customer.MailingAddress), GetSafeString(customer.MailingAddress2));
                    isTripValid = PCM.PCMSAddStop(tripId, addressToValidate.Trim()) == 1;
                    if (!isTripValid)
                    { 
                        customers.Add(customer);
                    }
                    i++;
                    if (i == 1000)
                    {
                        PCM.PCMSClearStops(tripId);
                        i = 0;
                    }
                }
                PCM.PCMSCloseServer(serverID);
                PCM.PCMSDeleteTrip(tripId);
    
                return customers;
    

1 个答案:

答案 0 :(得分:1)

  1. 您可以使用ParallelOptions类上的MaxDegreeOfParallelism属性控制线程数。

    ParallelOptions.MaxDegreeOfParallelism = 5; //将并发线程限制为5

  2. 您可以使用ForEach()重载控制分区,该重载采用分区程序&lt;&gt;对象作为参数。

    Here's a great article with an example on partitioning

  3. 它可能会改善你的表现,但在你尝试之前很难知道多少。

  4. 注意:如果您要开始使用多个线程,请确保所有共享对象/列表都是线程安全的。例如,您需要锁定客户列表或使用ConcurrentCollections命名空间中的集合。 PCM方法线程安全吗?