Подтвердить что ты не робот

Ошибка Winforms - Ошибка создания дескриптора окна

Мы видим эту ошибку в приложении 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)
4b9b3361

Ответ 1

Запустили ли вы Проводник процессов или Диспетчер задач Windows, чтобы посмотреть объекты GDI Objects, Handles, Threads и USER? Если нет, выберите те столбцы, которые нужно просмотреть (диспетчер задач выбирает View- > Select Columns... Затем запустите приложение и посмотрите на эти столбцы для этого приложения и посмотрите, растет ли один из них.

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

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

Удачи!

Ответ 2

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

Ответ 4

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

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

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

Ответ 5

Что ж, в моем случае именно объекты USER были выведены из-под контроля. Я посмотрел в диспетчере задач Windows и, конечно же, подсчет объектов USER был точно в 10 000.

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

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

В С# кажется, что если управление, например, Панель программно переназначается, например, с помощью формы на страницу вкладок, изменяя свойство Panel.Parent, вызывая Dispose() в форме, не будет удалять Panel, и не будет вызывать Controls.Clear() на странице вкладок. Даже прямой вызов Panel.Dispose() на самом деле не удалит его, если только его родитель вручную не установлен на нуль.

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

У меня такая же ошибка в моем приложении. Я загружаю много элементов управления на одной странице. В момент нажатия кнопки мыши я очищаю элементы управления. Очистка элементов управления не освобождает элементы управления из памяти. Поэтому удалите элементы управления из памяти. Я просто прокомментировал метод controls.clear() и включил несколько строк кода для управления элементами управления. Что-то вроде этого

для каждого ctl как управления в controlcollection

ctl.dispose()

Далее

Ответ 10

Предложение из памяти не кажется неудачным.

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

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

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