我正在从tblCustomer循环数据并检查地址是否有效。如果没有,那么我将其添加到我的返回列表中。 问题是,有37000行要验证。验证通过外部库完成。这需要大约1小时。我想做这个线程所以我可以更快地做到这一点。 有人可以帮我改写吗?我也读到了某个地方将这个包装在并行类或foreach中。我很想知道几件事 -
它会创建多少个线程?我们怎么能控制它呢?
我们可以说每个线程将处理多少条记录?
我认为最棘手的问题是:这个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 :(得分:1)
您可以使用ParallelOptions类上的MaxDegreeOfParallelism属性控制线程数。
ParallelOptions.MaxDegreeOfParallelism = 5; //将并发线程限制为5
您可以使用ForEach()重载控制分区,该重载采用分区程序&lt;&gt;对象作为参数。
它可能会改善你的表现,但在你尝试之前很难知道多少。
注意:如果您要开始使用多个线程,请确保所有共享对象/列表都是线程安全的。例如,您需要锁定客户列表或使用ConcurrentCollections命名空间中的集合。 PCM方法线程安全吗?