2010-07-06 9 views
2

나는 자주 삭제되는 List를 가지고 있습니다. 이 코드는 정확히 다음과 같습니다..ToArray()를 호출 할 때 ArgumentException이 발생합니다.

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 (이 예에서는 보이지 않음)을 알지 않는 한 이에 영향을 미치지 않습니다.

관련 문제