Проблема Winforms-ошибка создания дескриптора окна [дубликат]



этот вопрос уже есть ответ здесь:




  • "Ошибка При Создании Дескриптора Окна"

    7 ответов



мы видим эту ошибку в приложении Winform. Может ли кто-нибудь помочь в том, почему вы видите эту ошибку, и, что более важно, как ее исправить или избежать ее.




System.ComponentModel.Win32Exception: Error creating window handle.
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e)
at System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e)
1209   10  

10 ответов:

вы запустили Process Explorer или Диспетчер задач Windows, чтобы посмотреть на объекты GDI, дескрипторы, потоки и пользовательские объекты? Если нет, выберите эти столбцы для просмотра (Диспетчер задач выберите вид->выбрать столбцы... Затем запустите приложение и посмотрите на эти столбцы для этого приложения и посмотрите, действительно ли один из них растет.

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

здесь ссылка об этом, что может быть полезным.

Удачи!

окна для вашего приложения составляет 10 000 ручек. Вы получаете сообщение об ошибке, потому что ваша программа создает слишком много дескрипторов. Вам нужно будет найти утечку памяти. Как предлагали другие пользователи, используйте профилировщик памяти. Я также использую профилировщик памяти .Net. Кроме того, убедитесь, что вы вызываете метод dispose для элементов управления, если вы удаляете их из формы до форма закрывается (в противном случае элементы управления не будут утилизировать). Вы также будете иметь, чтобы убедиться, что события, зарегистрированные в элементе управления, отсутствуют. У меня самого такая же проблема, и, несмотря на то, что я уже знаю, у меня все еще есть некоторые утечки памяти, которые продолжают ускользать от меня..

посмотреть Это мое сообщение об "ошибке создания дескриптора окна" и как это относится к пользовательским объектам и куче рабочего стола. Я предлагаю некоторые решения.

эта проблема почти всегда связана с количеством объектов GDI, количеством объектов пользователя или количеством дескрипторов и обычно не из-за состояния нехватки памяти на вашем компьютере.

когда я отслеживаю одну из этих ошибок, я открываю ProcessExplorer и наблюдаю за этими столбцами: дескрипторы, потоки, объекты GDI, объекты пользователя, частные байты, виртуальный размер и рабочий набор.

(по моему опыту, проблема обычно заключается в утечке объекта из-за обработчика событий, удерживающего объект и предотвращение его утилизации.)

Ну, в моем случае это были определенно пользовательские объекты, которые вышли из-под контроля. Я посмотрел в Диспетчере задач Windows и, конечно же, количество пользовательских объектов было точно 10'000.

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

NB: в Delphi все элементы управления имели владельца и родительское свойство. Даже если кто-то изменил родительское свойство элемента управления, он все равно будет удален его владельцем, когда собственный элемент управления будет уничтожен.

в C# кажется, что если элемент управления, например панель, программно переназначается, скажем, из формы на вкладку, изменив панель.Родительское свойство, вызывающее Dispose() в форме, не будет удалять панель, и не будет вызов элементов управления.Очистить () На вкладке страницы. Даже панель прямого вызова.Dispose () фактически не будет его утилизировать, если его родитель не установлен вручную в null заранее.

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

Я добавил чек, который заставляет его работать...

if (_form.Handle.ToInt32() > 0)
{
   _form.Invoke(method, args);
}

это всегда так, но форма выдает ошибку без нее. Кстати, моя ручка составляет около 4,9 миллиона

Я получил ту же ошибку в моем приложении.Я загружаю много элементов управления в одном page.In нажмите кнопку событие я очищаю элементы управления.очистка элементов управления не освобождает элементы управления от memory.So утилизируйте элементы управления из памяти. Я только что прокомментировал управление.очистите метод() и включите несколько строк кода для удаления элементов управления. Что-то вроде этого

для каждого ЦТЛ в качестве контроля в экземпляре коллекции controlcollection

ctl.dispose ()

далее

определенно слишком много ручек(проблема с утечкой памяти):

это джунгли: система.ComponentModel.Win32Exception: ошибка при создании дескриптора окна

предложение из памяти не кажется плохим руководством.

что ваша программа делает, что она получает эту ошибку?

Это создает очень много окон или элементов управления? Создает ли он их программно, а не во время разработки? Если да, то вы делаете это в цикле? Это бесконечный цикл? Вы потребляете ошеломляющие лодки памяти каким-то другим способом?

Что происходит, когда вы смотрите памяти, используемой приложением в диспетчере задач? Делает он взлетел на Луну? Или еще лучше, как было предложено выше, используйте process monitor, чтобы погрузиться в детали.

Comments

    Ничего не найдено.