我有一個特定的方法是偶爾用一個ArgumentException崩潰:LIST <>的AddRange拋出ArgumentException的
Destination array was not long enough. Check destIndex and length, and the array's lower bounds.:
at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
at System.Collections.Generic.List`1.CopyTo(T[] array, Int32 arrayIndex)
at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
at System.Collections.Generic.List`1.AddRange(IEnumerable`1 collection)
導致此崩潰的代碼看起來是這樣的:
List<MyType> objects = new List<MyType>(100);
objects = FindObjects(someParam);
objects.AddRange(FindObjects(someOtherParam);
根據MSDN,列表<> .AddRange()應根據需要自動調整其大小:
如果新計數(當前計數加上集合的大小)將大於容量,則通過自動重新分配內部數組以適應新元素來增加列表<(Of> <(T>)>)的容量,並且在添加新元素之前將現有元素複製到新數組中。
有人能想到AddRange可以拋出這種異常的情況嗎?
編輯:
響應於關於FindObjects問題()方法。它基本上看起來像這樣:
List<MyObject> retObjs = new List<MyObject>();
foreach(MyObject obj in objectList)
{
if(someCondition)
retObj.Add(obj);
}
FindObjects返回什麼?另外,爲什麼初始化'objects'然後及時在下一行重新分配它? – 2010-04-07 14:31:38
當您添加一個項目時,它會檢查大小是否足夠大,如果不是,則調整它使用的內部數組大小。然而,當使用多線程時,可以檢查,獲取false並調整數組大小,下一個線程讀取的是足夠的空間並且不調整大小,然後它們都會到達實際的'this._items [this._size ++] = item ;'代碼在同一時間...導致後者線程爆炸。當Jon說'List'在下面的答案中不是線程安全的,這是'List '不能處理的事情之一。 –
2010-04-07 14:39:52
我沒有寫代碼,我只是在調試這個問題。有很多奇怪的東西,維護人員在翻找時發現:) – Tim 2010-04-07 14:41:07