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
嗎?
循環之間共享'日期'值?因爲'+ ='操作(發生在它的'HedgeCleanIntrinsicValue'和'HedgeCleanPrice')不是線程安全的。也許你應該發佈你的'CheckAndLoadTrade'方法。 「CreateAccountingValuation」或「ValueTrade」中發生的任何應該注意的事情? –
您想如何使用此訪問權限?如果你遍歷一個共享的_hedgeTranQuoteIds(不管它被定義爲併發列表還是NOT),你可能會得到重複的'tran'值由多線程處理。這是你想要的嗎?任何方法是否將由'tran'從列表中檢索到的對象從列表中刪除,以便不重新檢索?如果檢索相同的值是好的,那麼是的,只要使CheckAndLoad方法和ValueTrade方法鎖定條目上的字典即可。但是,根據你的代碼,你可能只能使用併發字典。 – xagyg