Переполнение экземпляра класса C # - PullRequest
0 голосов
/ 24 марта 2010

Сценарий

У меня есть приложение C # Win Forms, в котором основная форма содержит цикл, который создает 3000 экземпляров другого КЛАССА (КЛАССА B). Внутри формы B имеется большое количество свойств и полей, а также множество методов, которые выполняют значительную часть обработки.

Вопрос

Создание 3000 таких классов доставит мне проблемы? Я думаю в соответствии с исключениями памяти? У меня уже было 1 или 2, и у меня также было исключение, которое говорит что-то вроде «Что-то пошло не так, и это обычно является признаком испорченной памяти где-то еще».

Настройка

Я использую форму ленты DevExpress, и я не реализовал Dispose на чем-либо .... Нужно ли это?

Помощь с благодарностью.

РЕДАКТИРОВАТЬ - Я никогда не хотел сказать 3000 ФОРМ ..... Я хотел сказать, что у меня есть одна форма, которая создает 3000 экземпляров другого класса .....

Ответы [ 4 ]

4 голосов
/ 24 марта 2010

3000 объектов в целом не массивны, но должны подвергнуть сомнению разумность 3000 форм.

Предположительно, вы не отображаете все это пользователю одновременно, поэтому лучшим подходом может быть открытие экземпляров формы в соответствии с требованиями пользователя и наличие метода DisplayData (..), который заполняет форму данными, необходимыми для этого запись. Пользователь вряд ли сможет открыть 3000 одновременно! 3-5 будет более разумным.

Вам также следует подумать о том, чтобы перестроить свое приложение так, чтобы логика обработки была отделена от самих форм. Это даст вам больше гибкости для масштабирования слоя обработки, если вам нужно. Начните с Google для MVC / MVP.

1 голос
/ 24 марта 2010

Вам нужно прочитать эту статью . У вас не хватит дескрипторов окон, и вам нужно реализовать и вызвать dispose, но, как говорится в статье, если вам нужно спросить об этом, вы делаете что-то не так.

Каждый элемент управления в Windows Forms получает уникальный дескриптор окна. Как указывается в статье, каждый процесс получает 10000 ручек. Дескрипторы освобождаются вызовом dispose, поэтому вам нужно убедиться, что вызов формы избавляется от дочерних элементов управления. Большинство контейнерных контролей позаботятся об этой части за вас, но дважды проверьте. Помните, что каждый элемент управления, текстовые поля все.

Я ударил это однажды. У нас были очень сложные формы, которые закрывались, когда пользователь делал с ними, но мы не распоряжались ими должным образом. Мы достигли предела ручки в спешке. Это также побудило нас переосмыслить объем информации, который пользователь может реально мысленно обработать за один раз, и мы упростили формы.

Это были наши автоматические приемочные испытания, которые поймали нас. Они прошли через формы быстрее, чем пользователь, и в спешке достигли предела ручки.

РЕДАКТИРОВАТЬ В ответ на изменение вопроса

Ну, если это не 3000 форм, с тобой все будет в порядке. Вы все равно должны прочитать ссылку, это полезно знать. Но 3000 экземпляров это совсем немного. Даже если у каждого из них по 1000 свойств, с вами все будет в порядке. В качестве простой проверки вы можете посмотреть приложение в диспетчере задач, чтобы убедиться, что оно в порядке.

В общем, вам нужно реализовать IDisposable и вызывать его, если у ваших классов есть ссылки на такие вещи, как дескрипторы окон, файлы, соединения с базой данных и т. Д. Я не знаю, что делают ваши 3000 экземпляров, поэтому я не могу вам сказать, если вам нужно IDisposable в этом случае.

1 голос
/ 24 марта 2010

попробуйте запустить приложение с помощью профилировщиков памяти и посмотреть, где происходит утечка памяти ..

http://memprofiler.com/
0 голосов
/ 24 марта 2010

Я бы порекомендовал рассмотреть шаблон веса: http://en.wikipedia.org/wiki/Flyweight_pattern Это специально разработано для обработки ситуаций, когда вы обычно создаете большое количество объектов, и вместо этого динамически создает экземпляры, когда они действительно необходимы.
Примером навесного веса может быть использование класса коллекции, такого как словарь, для хранения всех свойств, которые ваши объекты должны сохранять, и когда вам нужно взаимодействовать с конкретным объектом, наименьший вес вытягивает свойства и создает объект динамически, после завершения со свойствами сохраняются обратно в коллекцию и освобождается ссылка на объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...