我如何确定这个方法是否是线程安全的

本文关键字:是否是 线程 安全 方法 何确定 | 更新日期: 2023-09-27 18:09:12

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吗?

我如何确定这个方法是否是线程安全的

你想并行化的是哪一部分?foreach循环?

如果可以,使用ConcurrentDictionary。在CheckAndLoadTrade内。另一个问题是,当交易不在字典中时,运行什么代码。"loadtrade"代码线程安全吗?