2013-12-23 3 views
-2

У меня есть эта проблема, когда у меня есть очень большая форма (winforms), загружаемая методом Activation.CreateInstance(Type), потому что загрузочный контейнер используется для разных форм. Он открывается в первый раз, но если я закрою его, а затем снова открою его, он всегда будет разбиваться на полпути через метод InitializeComponent(), где он «прыгает» на метод Dispose(), сбой на NullReferenceException.Большая ошибка, возникающая при втором открытии

Моя нынешняя теория заключается в том, что вызов Dispose() происходит из предыдущего экземпляра формы, у которой не было времени до конца, и теперь пытается избавиться от текущей формы. (это имеет смысл?) С другой стороны, я думаю, что, возможно, это проблема Activation.CreateInstance(), но это первый раз, когда я вижу этот класс, поэтому я тоже не уверен в этом.

Вчера я проверил тест во время отладки, и, если я подождал несколько секунд на каждой строке при сбое InitializeComponent(), я прошел без ошибок.

+0

Почему бы вам просто не скрывать, а не закрывать? Если ваша теория 'dispose' правильная, это должно быть хорошо. – KSdev

+0

Я попробовал 'hide' вместо' close', но он по-прежнему падает. Есть ли способ узнать, находится ли объект в распоряжении и не позволяет пользовательскому интерфейсу повторно открыть форму до ее завершения? –

+1

вы можете указать пример кода? – Grundy

ответ

0

Наконец-то я нашел источник ошибки: в форме загрузки есть сотни сеток с небольшими панелями инструментов, каждая из которых имеет 5-6 значков. И диспетчер ресурсов является немного глупым, вместо того, чтобы повторно использовать один и тот же значок каждый раз (панели инструментов являются экземплярами одного и того же usercontrol), каждый раз он запускает новую растровую карту, вызывая нехватку памяти. Но вместо того, чтобы провалиться с очевидной ошибкой, он безводит ее и начинает распоряжаться вызывающими объектами, поэтому удаляет не полностью созданные объекты. Поэтому решение состоит в том, чтобы загружать изображения только один раз при использовании диспетчера ресурсов. Мало того, что он разрешит крах, он также загружается быстрее.

Смежные вопросы