2012-10-28 69 views
2

我正在循环来自tblCustomer的数据并检查地址是否有效。如果没有,那么我将它添加到我的返回列表中。 这个问题有37000行需要验证。验证通过外部库完成。这需要约1小时。我想这样做,所以我可以做得更快。 有人可以帮我改写它吗?此外,我还在某处阅读并行课程或foreach。我想知道的几件事 -通过并行运行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; 
+0

http://msdn.microsoft.com/en-us/library/hh156513.aspx应该能够提供帮助。 –

+0

异步不是我正在寻找的。即使UI线程被锁定了几分钟,我也没有问题。只要速度很快。现在需要60分钟。 :( –

回答

1
  1. 您可以控制使用的ParallelOptions类MaxDegreeOfParallelism财产的线程数。

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

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

    Here's a great article with an example on partitioning

  3. 它可能仍然会提高你的表现,但很难知道多少,直到你试试吧。

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

+0

从我的理解,他们是线程安全的。你能告诉我你在1和2说的代码的例子吗? –

+0

我实际上没有写我自己的分区器,但我已经把一个链接到一个有很多关于它的文章,有例子,希望有帮助 –

+0

有没有人有一个类似于我的问题的例子,并得到它的工作? –