在循环内部进行线程化以提​​高性能

时间:2012-01-19 15:54:39

标签: c# .net multithreading loops thread-safety

foreach (int tranQuote in transactionIds)
            {
                CompassIntegration compass = new CompassIntegration();
                Chatham.Business.Objects.Transaction tran = compass.GetTransaction(tranQuote);

                // then we want to send each trade through the PandaIntegration
                // class with either buildSchedule, fillRates, calcPayments or
                // a subset of the three
                PandaIntegrationOperationsWrapper wrapper = new PandaIntegrationOperationsWrapper { buildSchedule = false, calcPayments = true, fillRates = true };
                new PandaIntegration().RecalculateSchedule(tran, wrapper);

                // then we call to save the transaction through the BO
                compass.SaveTransaction(tran);
            }

这里有两行需要很长时间。 transactionIds中有大约18k的记录,我这样做。

GetTransactionSaveTransaction是占用时间最多的两行,但老实说,我想了解循环中发生的事情以提高性能。

什么是解决这个问题的最佳方法,而不会遇到CPU或类似问题?我不确定有多少线程是安全的,或者如何线程管理或类似的东西。

谢谢你们。

3 个答案:

答案 0 :(得分:3)

TPL将提供必要的限制和管理。

//foreach (int tranQuote in transactionIds) { ... }
Parallel.ForEach(transactionIds, tranQuote => { ... } );

它确实需要Fx4或更高版本,并且循环内的所有代码都必须是线程安全的 目前尚不清楚您的GetTransaction和SaveTransaction是否可以安全地同时调用。

答案 1 :(得分:3)

GetTransaction和SaveTransaction实际上做了什么让它们变慢?如果它在CPU上工作,那么线程肯定会有所帮助。如果缓慢来自进行数据库查询或执行文件I / O,则线程不会做任何事情来使您的磁盘或数据库更快。它实际上可能会降低速度,因为现在您有多个同时发出的请求转到已经受约束的资源。

答案 2 :(得分:1)

如果顺序无关紧要,可以使用Parallel foreach来提高整体性能