2010-04-07 8 views
9

tengo un método particular que se ocasionalmente chocando con un ArgumentException:LISTA <> AddRange tirar 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) 

El código que está causando este accidente es como la siguiente:

List<MyType> objects = new List<MyType>(100); 
objects = FindObjects(someParam); 
objects.AddRange(FindObjects(someOtherParam); 

Según MSDN, lista <> .AddRange() debería redimensionarse automáticamente según sea necesario:

Si el nuevo recuento (el recuento actual más el tamaño de la colección) será mayor que la capacidad, la capacidad de la lista < (de < (T>)>) se incrementa mediante la reasignación automática de la matriz interna para acomodar los nuevos elementos , y los elementos existentes se copian a la nueva matriz antes de agregar los nuevos elementos.

¿Alguien puede pensar en una circunstancia en la que AddRange podría arrojar este tipo de excepción?


Editar:

En respuesta a las preguntas sobre los FindObjects (método). Básicamente es como la siguiente:

List<MyObject> retObjs = new List<MyObject>(); 

foreach(MyObject obj in objectList) 
{ 
    if(someCondition) 
     retObj.Add(obj); 
} 
+1

¿Qué devuelve 'FindObjects'? Además, ¿por qué inicializa 'objects' y luego lo reasigna rápidamente en la siguiente línea? –

+0

Cuando agrega un artículo, verifica si el tamaño es lo suficientemente grande, si no cambia el tamaño de la matriz interna que utiliza. Sin embargo, al usar múltiples hilos, uno puede verificar, obtener un falso y cambiar el tamaño de la matriz, el siguiente hilo dice que hay suficiente espacio y no cambia el tamaño, entonces ambos alcanzan el elemento 'this._items [this._size ++] = ; 'código al mismo tiempo ... causando que el último hilo explote. Cuando Jon dice 'List ' no es seguro para subprocesos en la respuesta siguiente, esta es una de las cosas que 'List ' no maneja. –

+0

No escribí el código, simplemente estoy depurando el problema. Hay muchas cosas raras que los mantenedores encuentran cuando hurgan :) – Tim

Respuesta

20

¿Estás tratando de actualizar la misma lista de múltiples hilos? Eso podría causar problemas ... List<T> no es seguro para múltiples escritores.

+0

El método FindObjects() crea una instancia de un nuevo objeto List <>, lo rellena y lo devuelve. Todos son de subproceso único, por lo que no creo que existan posibilidades de que varios subprocesos funcionen en la Lista. – Tim

+0

@Tim: Entonces no puedo ver por qué sucedería. Vea si puede encontrar un programa breve pero completo que demuestre el problema. Si podemos reproducirlo, deberíamos poder arreglarlo. –

+0

Esto es más o menos lo que esperaba escuchar. No he podido reproducir este problema, y ​​me parece que nunca debería suceder. Solo quería asegurarme de no perderme nada antes de rechazarlo como un problema. – Tim

0

Honestamente, no estoy seguro, pero ¿por qué no eliminar la declaración de tamaño en la inicialización de la lista?

List`<MyType>` list = new List`<MyType>` 
+3

Porque esa inicialización se descarta rápidamente. Ni siquiera * necesita * ser inicializado de esta manera. –

Cuestiones relacionadas