У вас есть пара проблем.
- Как отметил Марк, вы захватываете переменную цикла, которая действительно запутает все.
- Вы изменяете коллекцию, одновременно читая ее без использования механизмов синхронизации.
Я предполагаю, что вы пропустили код для получения batchCollection
, а затем периодически для краткости удаляете их из recordsCollection
, в противном случае там также будут проблемы.
Вот как вы можете это исправить.
ArrayList recordsCollection = new ArrayList();
ArrayList batchCollection = null;
int idx = 0;
while(true)
{
lock (recordsCollection)
{
recordsCollection.Add(batchCollection);
}
int capturedIndex = idx; // Used for proper capturing.
ThreadPool.QueueUserWorkItem(delegate
{
ArrayList range;
lock (recordsCollection)
{
range = recordsCollection.GetRange(capturedIndex, 1);
}
ProcessCollection(range);
});
idx++;
}
Или моя измененная версия, которая, насколько я могу судить, делает то же самое ...
List<List<Record>> recordsCollection = new ArrayList();
List<Record> batchCollection = null;
while(true)
{
recordsCollection.Add(batchCollection);
List<List<Record>> range = new List<List<Record>>();
range.Add(batchCollection);
ThreadPool.QueueUserWorkItem(delegate
{
ProcessCollection(range);
});
}