gpt4 book ai didi

c# - 通过并行运行 foreach 循环以构建结果列表

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:18 25 4
gpt4 key购买 nike

我循环遍历来自 tblCustomer 的数据并检查地址是否有效。如果没有,那么我会将其添加到我的返回 list 中。问题是,有 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;

最佳答案

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

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

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

    Here's a great article with an example on partitioning

  3. 它可能仍会提高您的表现,但在您尝试之前很难知道效果如何。

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

关于c# - 通过并行运行 foreach 循环以构建结果列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com