Вы удаляете из начала списка, что приведет к созданию нового списка и копированию в него старого.Это приведет к хаосу с кучей больших объектов , учитывая, что вы имеете дело со списками с большим количеством элементов.
Если вы должны использовать этот тип дизайна, удаляйте элементы в обратном направлении,это предотвратит копирование базового массива списка, т. е. удаления от конца к началу.
Лучше было бы использовать счетчик, который вы увеличиваете с помощью Interlocked.Increment, и использовать его для доступа к членам вашегосписок.Вы можете сделать это безопасно, поскольку вы не меняете свой список после того, как создали его.
Обновлено
Из моего комментария
Высериализует доступ ко всему коду в DoWork, поэтому нет смысла использовать несколько потоков.
Что-то вроде следующего позволит избежать проблемы с удалением из вашего списка идентификаторов, а также позволит вам потенциально получать элементы одновременно изваш репозиторий и так использовать эти дополнительные темы.Хотя это нужно было бы измерить - добавление потоков не является гарантией повышения производительности.
Также, если ваш «_repository» является коллекцией, убедитесь, что его размер равен размеру списка идентификаторов.Это предотвратит большое копирование промежуточного массива по мере увеличения коллекции при добавлении элементов.
private static int _counter = -1;
public static void DoWork(Object stateInfo)
{
int index;
while ((index = Interlocked.Increment(ref _counter)) < MyList.Count)
{
string id = MyList[index];
var record = _repository.GetRecord(id);
lock (LockObject)
{
_repository.Add(record);
}
if (index % 100 == 0)
Console.WriteLine(DateTime.Now + " - Imported " + (index + 1) + " Records..");
}
}