2012-04-28 21 views
32

que tienen una clase con el siguiente método:¿Matriz de destino no es lo suficientemente larga?

public List<Bike> bikesCopy 
{ 
    get 
    { 
     List<Bike> bs; 
     lock (_bikes) bs = new List<Bike>(_bikes); 
     return bs; 
    } 
} 

¿Qué hace una copia de otra lista, private List<Bike> _bikes;

Lo extraño ahora es, que me sale el siguiente error:

Destination array was not long enough. Check destIndex and length, and the array's lower bounds.

¿Cuál es el problema aquí?

+0

¿De dónde exactamente obtienes la excepción? ¿Puedes actualizar la pregunta con el trazado de la pila de excepción y señalar la línea de código exacta donde se lanza? –

+0

Sí, es el siguiente mensaje (lo siento por el desorden): 'en System.Array.Copy (Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean confiable) en System.Array.Copy (Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length) en System.Collections.Generic.List'1.CopyTo (T [] array, Int32 arrayIndex) en System.Collections.Generic.List'1. .ctor (colección IEnumerable'1) en MyGame.Player.get_bikesCopy() ' – Geert

+2

¿Has llegado a la raíz de este problema? Me estoy encontrando con algo similar. –

Respuesta

51

Yo diría que el error está en el objeto _bikes no ser seguro para subprocesos. Como se comentó, en algún lugar hay una modificación del objeto _bikes que no está bloqueado.

Es un segundo error de división donde la variable B en está configurado para un tamaño de X cuando se mide el tamaño de _bikes. En la siguiente fracción de segundo, ya que está a punto de llenar la lista, el objeto _bikes ha aumentado de tamaño y ha dado el error.

Así que revise su código. Busque todas las referencias de su _bikes objeto y asegúrese de que se manejen a prueba de hilos (con bloqueo).

+0

Lo siento terriblemente, accidentalmente hice clic en el voto a favor, pero en realidad quería volver a votar y ahora ya no puedo dejar de votar: - ¡Lo siento! –

+0

Eso está bien. Lo peor es cuando bajas y no tienes ni idea de por qué. – Wolf5

+0

Sí, tengo un "fan" hace un par de días (18 votos a favor en 2 minutos) y aprendí sobre el bot antiserial downvoting. Me gusta mucho ese bot :-) P.S .: El sitio web dice que, si editas la respuesta, puedo deshacer el voto de nuevo. –

6

Bien podría intentar: se discuten aquí

using System.Linq; //ToList() is an extension function defined here 
... 
lock(_bikes) 
    return _bikes.ToList(); 

Los detalles de la excepción: Why doesn't a foreach loop work in certain cases?

+1

No soy capaz de usar LINQ, ya que no está en la lista blanca en mi marco ... De todos modos, tampoco responde mi problema :) – Geert

+7

No puedes usar LINQ ?!?!? ¡Dejaría ese trabajo tan pronto como lo descubriera! –

+0

No estoy seguro de por qué, pero '.ToList()' funciona muy bien frente a 'new List (YourList)', que siempre arroja una excepción. –

0

No es realmente una respuesta, más un comentario de investigación.

Me encontré con el mismo problema e hice una prueba rápida. He intentado con el siguiente código y no pude obtener este código para arrojar el ArgumentException: Destination array was not long enough. Pero cuando quito la .ToList() desde la línea de

return allLines.ToList().ToArray(); 

se bloquea inmediatamente.

Este es el código de demostración e incluso el IDE me dice que debería eliminar la llamada ToList() ya que parece redundante.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main() { 

      List<string> thelist = new List<string>(); 

      Thread producer = new Thread(() => { 
       while (true) { 
        thelist.Add("a" + DateTime.Now); 
       } 
      }); 

      Thread transformer = new Thread(() => { 
       while (true) { 
        string[] thearray = thelist.ToList().ToArray(); 
        Console.WriteLine(thearray.Length); 
       } 
      }); 
      producer.Start(); 
      transformer.Start(); 
      Console.ReadKey(true); 
     } 
    } 
} 

Me pregunto, ¿por qué no se estrellaría, como la lista también está respaldada por una matriz.

Cuestiones relacionadas