it-swarm.com.ru

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

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

 System.ComponentModel.Win32Exception: Ошибка создания дескриптора окна. 
 В System.Windows.Forms.NativeWindow.CreateHandle (CreateParams cp) 
 В System.Windows.Forms.Control.CreateHandle () 
 в System.Windows.Forms.Control.CreateControl (Boolean fIgnoreVisible) 
 в System.Windows.Forms.Control.CreateControl () 
 в System.Windows.Forms. Control.OnVisibleChanged (EventArgs e) 
 В System.Windows.Forms.ButtonBase.OnVisibleChanged (EventArgs e) 
59
leora

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

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

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

Удачи!

51
itsmatt

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

25
mjezzi

Смотрите мой пост о "Ошибка создания дескриптора окна" и как это связано с объектами USER и Desktop Heap. Я предоставляю некоторые решения.

11
Fabrice

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

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

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

6
AlfredBr

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

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

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

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

2
kingsley

Я добавил проверку, которая заставляет это работать ...

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

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

1
xlthim

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

1
AtliB

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

IT Jungles: System.ComponentModel.Win32Exception: Ошибка при создании дескриптора окна

0
user344760

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

для каждого ctl в качестве контроля в controlcollection

ctl.dispose ()

Следующий

0
honey0987