2013-04-15 112 views
0
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

循環之間共享'日期'值?因爲'+ ='操作(發生在它的'HedgeCleanIntrinsicValue'和'HedgeCleanPrice')不是線程安全的。也許你應該發佈你的'CheckAndLoadTrade'方法。 「CreateAccountingValuation」或「ValueTrade」中發生的任何應該注意的事情? –

+0

您想如何使用此訪問權限?如果你遍歷一個共享的_hedgeTranQuoteIds(不管它被定義爲併發列表還是NOT),你可能會得到重複的'tran'值由多線程處理。這是你想要的嗎?任何方法是否將由'tran'從列表中檢索到的對象從列表中刪除,以便不重新檢索?如果檢索相同的值是好的,那麼是的,只要使CheckAndLoad方法和ValueTrade方法鎖定條目上的字典即可。但是,根據你的代碼,你可能只能使用併發字典。 – xagyg

回答

1

你試圖並行化哪個部分? foreach循環?如果可以,使用ConcurrentDictionary。在CheckAndLoadTrade之內。另一個問題是當交易不在字典中時代碼運行的是什麼。 「loadtrade」代碼是線程安全的嗎?

+0

您的第一個問題的答案:是的。當交易不在字典中時,'LoadTrade'方法運行,而且它是線程安全的,而不是它訪問相同字典的事實。它所做的一切都是調用Web服務並處理它自己的變量。 – Scott

+1

然後,如果您可以更改方法以使用可能是最高性能方法的ConcurrentDictionary。 – Brandon