2009-12-17 65 views
21

在一個繁忙的ASP .NET網站上,我有一個Dictionary,它充當緩存,基本上存儲鍵/值對供以後檢索。什麼時候字典在Add或ContainsKey上拋出IndexOutOfRangeException?

在高負載時,字典一些時間進入狀態,它總是拋出每當我打電話的containsKey或添加方法的IndexOutOfRangeException。異常發生在私人的FindEntry方法中。

我懷疑這可能是由於同步問題,但我不知道。

誰能告訴我在哪種情況下會發生這種情況?我的目標是收集足夠的信息,以便在開發環境中重現問題。

+0

您是否違反了*** Equals ***方法,它還用於內部比較對象? – serhio 2009-12-17 13:55:24

回答

20

的文檔Dictionary狀態:

所有實例成員不能保證線程安全的。

要允許由多個線程進行讀取和寫入訪問的集合,則必須實現自己的同步。

如果您沒有進行同步訪問Dictionary,那麼你可能會得到像你描述的(大概是因爲內部狀態不再有效)的問題。如果您想在您的開發環境中嘗試並重現此操作,請嘗試創建一個程序,該程序使用多個線程連續讀取和寫入Dictionary而不同步。

1

我同意這幾乎肯定是一個同步問題。

我不知道確切地描述何時以及如何這可能發生的任何文件 - 如果你在一個非線程安全的方式使用字典的行爲是不明確的。

對於你的開發環境中進行測試,我建議你運行一些並行線程隨機插入,刪除,連續循環(基本上是「濃縮版」發生了什麼事在生產環境中)更新等。

相關問題