У меня есть конкретный метод, который иногда отказывает с 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 () должен автоматически изменить размер себя по мере необходимости:
Если новое количество (текущее количество плюс размер набора) будет больше, чем Способность, способность Списка <(<(T>)>) увеличена путем автоматического перераспределения внутреннего массива для размещения новых элементов, и существующие элементы копируются в новый массив, прежде чем новые элементы будут добавлены.
Кто-то может думать об обстоятельстве, в которое AddRange мог бросить этот тип исключения?
Править:
В ответ на вопросы о FindObjects () метод. Это в основном выглядит примерно так:
List<MyObject> retObjs = new List<MyObject>();
foreach(MyObject obj in objectList)
{
if(someCondition)
retObj.Add(obj);
}
Вы пытаетесь обновить один и тот же список из нескольких потоков? Это может вызвать проблемы ... List
небезопасен для нескольких авторов.
Честно говоря, я не уверен, но почему бы просто не удалить объявление размера при инициализации вашего списка?
List`<MyType>` list = new List`<MyType>`