2

我从 tblCustomer 循环数据并检查地址是否有效。如果没有,那么我将其添加到我的退货清单中。问题是,有 37000 行需要验证。验证是通过外部库完成的。大约需要1小时。我想做这个线程,所以我可以做得更快。有人可以帮我重写吗?此外,我在某处阅读以将其包装在并行类 for 或 foreach 中。我想知道的几件事-

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

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

  3. 我认为最重要的问题是:这个 dll 有静态类,可以验证地址。当我将其拆分为线程时,它会给我带来任何性能提升……还是需要同样的时间?


 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;
4

1 回答 1

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

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

  2. 您可以通过使用将Partitioner<> 对象作为参数的ForEach()重载来控制分区。

    这是一篇很棒的文章,其中包含有关分区的示例

  3. 它可能仍然会提高你的表现,但在你尝试之前很难知道有多少。

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

于 2012-10-28T02:00:10.787 回答