在对象列表上并行?

时间:2011-03-24 17:37:41

标签: c#-3.0 parallel-processing

我有.net 3.5,我想使用Parallel.ForEach。我有需要从其他系统刷新的帐户列表。为此,我正在考虑创建帐户对象列表;我将调用accountObj.Process方法,它将进行处理。我想确保我的方法是正确的,事情将会到位吗?

如果你们中的任何人已经这样做了,那么你能否指出我正确的实施/例子等......

Paralle.ForEach如何在内部运作?它是为for循环的每个项创建一个线程还是使用有限的线程集?

海洋

2 个答案:

答案 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一起使用。