OutOfMemoryException (на 32-разрядные машины) так же часто, как о фрагментации фактические жесткие ограничения на память - вы найдете много об этом, но вот мой первый Google ударил кратко обсуждали это: http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx. (@Anthony Pegram ссылается на ту же проблему в своем комментарии выше).
Тем не менее, есть еще одна возможность, что приходит на ум для вашего кода выше: Как вы используете «IEnumerable» конструктор в список, вы может не дает объекту каких-либо намеков на размер сбор, который вы передаете в конструктор списка. Если объект, который вы передаете, не является коллекцией (не реализует интерфейс ICollection
), то за кадром будет реализована реализация списка (несколько раз), каждый раз оставляя слишком маленькую массив, который нужно собрать мусором. Вероятно, сборщик мусора не дойдет до этих отброшенных массивов, и вы получите свою ошибку.
Простейшим решением для этого было бы использовать конструктор List(int capacity)
, чтобы сообщить инфраструктуре, какой размер массива резервных копий выделить (даже если вы оцениваете и просто угадываете «50000», например), а затем используйте метод AddRange(IEnumerable collection)
для фактически заполнить свой список.
Так, простейший «Fix», если я прав: заменить
List<Vehicle> vList = new List<Vehicle>(selectedVehicles);
с
List<Vehicle> vList = new List<Vehicle>(50000);
vList.AddRange(selectedVehicles);
Все остальные комментарии и ответы по-прежнему применяются с точки зрения общих проектных решений - но это мог Быстрое исправление.
Примечание (как указано в @Alex ниже), это только проблема, если selectedVehicles
не является ICollection.
Что такое значение (и тип) 'selectedVehicles'? – harold
Когда было выбрано 'OutOfMemoryException', вы подключились к процессу с помощью отладчика и посмотрели, в чем проблема? Насколько велики были * объекты? .NET Framework имеет жесткий предел в 2 ГБ для размера объекта, минус накладные расходы, потребляемые самой картой. –
Возможно ли транспортное средство, а не класс? –