private void PerformValuations(DateTime testDate, RegressionEffectivenessTest.RegressionDateWithValues date)
{
var valueDate = new LegacyWCFRateTimeStamp { Type = RateTimeStampType.EndOfDay, TimeStamp = date.ValueDate };
var curveDate = new LegacyWCFRateTimeStamp { Type = RateTimeStampType.EndOfDay, TimeStamp = date.CurveDate };
var shiftDate = new LegacyWCFRateTimeStamp { Type = RateTimeStampType.EndOfDay, TimeStamp = date.ShiftDate };
if (date.NeedHedgeValues)
{
date.HedgeCleanPrice = 0M;
date.HedgeCleanIntrinsicValue = 0M;
foreach (var tran in _hedgeTranQuoteIds)
{
var tranquoteId = tran.TranQuoteId;
CheckAndLoadTrade(testDate, valueDate, shiftDate, curveDate, tran, tranquoteId);
var result = ValueTrade(tranquoteId);
var rtnVal = !result.Succeeded
? HandleFailure(tranquoteId, shiftDate, curveDate, result, valueDate)
: CreateAccountingValuation(valueDate, result);
date.HedgeCleanIntrinsicValue += rtnVal.IntrinsicValue - rtnVal.AccruedInterest.GetValueOrDefault(0);
date.HedgeCleanPrice += rtnVal.CleanPrice;
}
}
所以我试图在这个方法上运行Parallel.ForEach
。有几件事让我担心。第一个是在CheckAndLoadTrade
方法中,它访问类的private Dictionary
,如果它不存在,可能会向它添加一个项目,然后ValueTrade
方法获取一个项目来自这本词典。
如果我将其与此并行,我是否会遇到正在访问的字典的任何线程安全问题?或者可能是我没注意到的任何其他事情?所有其他方法调用都使用在自己的范围内定义的变量,我只担心这个Dictionary
。我应该在实际字典访问发生之前和之后抛出lock
吗?
答案 0 :(得分:1)
您想要并行化的部分是什么? foreach循环?
如果可以,请使用ConcurrentDictionary。在CheckAndLoadTrade
内。另一个问题是当交易不在字典中时代码运行。是" loadtrade"代码线程安全?