2010-09-21 49 views
2

我有以下方法:.NET的LINQ:檢查數組索引和長度EXCEPTION

/// <summary> 
/// Gets the specified side of trades. 
/// </summary> 
/// <param name="tradesDictionary">The trades dictionary.</param> 
/// <param name="side">The side.</param> 
public IEnumerable<TradeRecord> GetTrades(Dictionary<Guid, TradeRecord> tradesDictionary, Side side) 
{ 
    return (from tradeRecord in tradesDictionary.Values.ToList().AsParallel() 
      where (tradeRecord.OrderRecord.PairRecord.Id == _pairId) 
       && (tradeRecord.Side == side.ToString()) 
      orderby tradeRecord.Date, tradeRecord.DateCreated, tradeRecord.Id 
      select tradeRecord); 
} 

這將導致以下異常:

目標數組不夠長 複製所有項目在 集合中。檢查數組索引和 長度。

字典傳入,字號不斷增加。我以前沒有收到錯誤,唯一改變的是tradesDictionary中的數據量。

  1. 爲什麼會發生此異常?
  2. 我如何防止它發生?

回答

3

「的字典傳入,在規模不斷增加」

你的意思是,當你執行此代碼它被修改?這是一個禁忌。我懷疑ToList通話因此而失敗。 (ToList()已執行後,該列表應與字典有效分開。)

基本上Dictionary<TKey, TValue>不支持併發讀寫。您可能需要查看ConcurrentDictionary<,>,它允許您在另一個線程寫入時迭代它。

當它全部正常工作時,提高性能的一個建議是:在方法開始時調用side.ToString()一次而不是每次循環迭代。

+0

感謝Jon的建議。我會試試這個。 – c0D3l0g1c 2010-09-21 11:25:04

+0

將我的易失性Dictionary對象更改爲ConcurrentDictionary,並且不再接收錯誤。我在查詢開始時也做了你的建議 - 它的確提高了性能,但是可以忽略不計。隨着字典的增長,我相信性能增益會變得更加明顯。再次感謝! – c0D3l0g1c 2010-09-21 12:38:16