2010-07-06 52 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

我幾乎肯定你說得對,在你說完之後,我經歷了所有對狀態對象的迴應,而且看起來我錯過了一個。 – 2010-07-06 17:52:33

0

有些東西正在改變state列表之間的陣列分配的時間和列表的內容被複制的時間。鎖定v將不會對此產生任何影響,除非填充狀態的代碼知道v(在此示例中它似乎不是)。

相關問題