2010-07-06 2 views
2

У меня есть список, который очищается каждый так часто. Код точно так:ArgumentException при вызове .ToArray()

VisitorAgent[] toPersist; 
List<VisitorAgent> v = (List<VisitorAgent>)state; 

lock (v) 
{ 
    toPersist = v.ToArray();      

    v.Clear(); 
} 

//further processing of toPersist objects 

Сегодня я только что получил исключение аргумента, который не имеет смысла для меня, если не была проблема памяти. Но если это так, почему бы не исключить OOM? Что может вызвать это исключение при вызове ToArray()?

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

Я использую .NET 3.5 & C#.

ответ

6

Это просто кричит состояние гонки (заявление lock было первым ключом).

Я бы предположил, что некоторый другой код (в другом потоке) добавлен в List<T> после того, как он выделяет целевой массив, но до того, как он обернется копированием.

Первое, что я хотел бы сделать, это проверить, что каждый доступ к вашему списку состояний должным образом завернут в оператор lock.

+0

Im почти положительный вы правы, после того как вы сказали это, я прошел через все мои рефлексы к объекту состояния, и похоже, что я пропустил один. –

0

Что-то меняет список state между временем выделения массива и временем копирования содержимого списка. Блокировка на v не повлияет на это, если код, заполняющий состояние, не знает о v (что в данном примере не похоже).

Смежные вопросы