The IndexOutOfRangeException
is thrown when "an attempt is made to access an element of an array with an index that is outside the bounds of the array."
Note that the ArrayList
class is not thread-safe. It is possible that in multi-threaded scenarios, race-conditions will result in the ArrayList
attempting to read/write to the backing array at indices that are outside its range.
Example: One thread reduces the size of the backing array (perhaps through a TrimToSize
call) at the same time that another thread is adding to the collection. Now, if the backing array is at full capacity, the adding thread will attempt to expand its capacity (by allocating a new array) to accomodate the new element. The simultaneous TrimToSize
call then reverses this effect. Then, by the time the adding thread attempts to write to the array, the index that it thought was available would no longer be, causing the exception to be thrown.
Fix: Use thread-safe constructs, as appropriate to your situation.