2012-10-05 51 views
9

我consistenlty獲得在多線程.NET 3.5的應用程序如何重新創建「索引超出數組範圍」將項添加到Dictionary?

ERROR 26異常拋出這個錯誤。詳細信息:'System.IndexOutOfRangeException:索引超出了數組的邊界 。

在System.Collections.Generic.Dictionary`2.Insert(TKEY的鍵,TValue值,布爾添加)

在System.Collections.Generic.Dictionary`2.Add(TKEY的鍵,TValue值)

我想我知道如何解決它(添加鎖在那裏appropiate),但我希望能夠在我的本地環境重建這個問題,所以我一定會說我的固定它,我也能爲其添加單元測試。

你知道任何一致的方式來重新創建嗎?

+0

有沒有特別的原因你不使用'ConcurrentDictionary'? – Sconibulus

+0

@Sconibulus:這個應用程序是3。5,不能使用'ConcurrentDictionary' :( – StackOverflower

回答

8
Dictionary<string, string> dict = new Dictionary<string, string>(); 

Task.Factory.StartNew(() => { while (true) dict["a"] = "a"; }); 
Task.Factory.StartNew(() => { while (true) dict.Remove("a"); }); 
+0

是的,這會強制一個字典錯誤,但取決於OP正在使用的代碼以及他提出的解決方案的其餘部分,很有幫助。 – NotMe

+0

有了這段代碼,我完全可以重新創建問題,但不能說我的真實代碼也是如此。將問題標記爲已解決,因爲我認爲這是最好的選擇,而且不會丟失數百行代碼混合。謝謝! – StackOverflower

4

不幸的是,在出現競爭條件的多線程應用程序中保持一致是無法實現的。

機器和生產一個之間的硬件差異單獨將確保當確實發生了問題,它可能不會在同一個位置。即使硬件是相同的,軟件差異(特別是那些後臺服務)可能會導致時間差異,因此也是不可重複的情況。

哎呀,如果這些線程對外部資源的依賴關係(如DB調用)的生產和測試箱之間的網絡延遲差異可能保證你永遠無法複製它。

害羞的是在服務器上有一個調試器(壞主意),你可以做的最好的事情是對代碼進行可視化分析,修復你認爲需要修復的部分,測試它(以及你可以)然後釋放並在製作中觀看。

+0

+1感謝您的回答 – StackOverflower

1

這不會幫助你在本地重新創建錯誤,但完全消除誤差,MSDN文檔的通用Dictionary<TKey, TValue>說:

對於線程安全的替代品,看ConcurrentDictionary<TKey, TValue>

ConcurrentDictionary<TKey, TValue>文檔說:

表示鍵值對,可以是通過 多個線程同時訪問的線程安全集合。

不過請注意,這ConcurrentDictionary < TKEY的,TValue >僅在.NET 4.0及以上可用。

+0

我的應用程序是3.5,不能使用'ConcurrentDictionary' :( – StackOverflower

0

你爲什麼不創建字典的包裝與它ReaderWriterLockSlim。這樣你就可以在一個班級完成所有的鎖定。