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的记录,我这样做。
GetTransaction
和SaveTransaction
是占用时间最多的两行,但老实说,我想了解循环中发生的事情以提高性能。
什么是解决这个问题的最佳方法,而不会遇到CPU或类似问题?我不确定有多少线程是安全的,或者如何线程管理或类似的东西。
谢谢你们。
答案 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来提高整体性能