我有.net 3.5,我想使用Parallel.ForEach。我有需要从其他系统刷新的帐户列表。为此,我正在考虑创建帐户对象列表;我将调用accountObj.Process方法,它将进行处理。我想确保我的方法是正确的,事情将会到位吗?
如果你们中的任何人已经这样做了,那么你能否指出我正确的实施/例子等......
Paralle.ForEach如何在内部运作?它是为for循环的每个项创建一个线程还是使用有限的线程集?
海洋
答案 0 :(得分:0)
Parallel.ForEach
听起来像是一种非常合理的方法。它不会为每个项创建一个线程 - 它将列表分成不同线程的任务,但是对创建的数字保持一定的约束。如果您的任务是网络绑定的,我相信PFX 可能会注意到这一点并增加正在使用的线程数。这肯定是尝试的尝试。
我建议您阅读MS模式与实践小组的parallelism book以获取更详细的建议。
答案 1 :(得分:0)
我建议你阅读parallelism book 从MS模式和 实践组更详细 建议。
感谢Jon:)
book chapter 2中的信用审核示例显示了如何执行此操作。您实际上可以使用Parallel.ForEach
Parallel.ForEach(accounts.AllAccounts, account =>
{
Trend trend = SampleUtilities.Fit(account.Balance);
double prediction = trend.Predict(account.Balance.Length + NumberOfMonths);
account.ParPrediction = prediction;
account.ParWarning = prediction < account.Overdraft;
});
或PLINQ:
accounts.AllAccounts
.AsParallel()
.ForAll(account =>
{
Trend trend = SampleUtilities.Fit(account.Balance);
double prediction = trend.Predict(account.Balance.Length + NumberOfMonths);
account.PlinqPrediction = prediction;
account.PlinqWarning = prediction < account.Overdraft;
});
在这两种情况下,TPL都会从一个线程池.NET ThreadPool中分配工作。 TPL使用自适应范围分区和自适应并发来最大化吞吐量。您可以使用客户分区程序更好地控制集合在不同线程上的拆分方式。您还可以使用MaxDegreeOfParallelism设置最大并发度。一般来说,除非你看到性能问题,否则最好让TPL自己进行优化。
注意:如果您只有.NET 3.5,则不存在任务并行库(TPL)功能。曾经有一个针对3.5的TPL的CTP但是已经不再可用了。我相信TPL二进制文件也是Rx for .NET 3.5 download的一部分。这可能会让您有机会将TPL与3.5一起使用。