c# - Problema de Winforms-Error al crear el identificador de ventana
windows window-handles (10)
¿Ha ejecutado el Explorador de procesos o el Administrador de tareas de Windows para observar los Objetos, Manijas, Subprocesos y objetos USER de GDI? De lo contrario, seleccione las columnas que desea ver (Administrador de tareas, elija Ver-> Seleccionar columnas ... Luego ejecute su aplicación y eche un vistazo a esas columnas para esa aplicación y vea si una de ellas está creciendo realmente grande.
Es posible que tengas componentes de UI que creas que están limpios pero que no han sido eliminados.
Aquí hay un enlace sobre esto que podría ser útil.
¡Buena suerte!
Esta pregunta ya tiene una respuesta aquí:
- "Error Creating Window Handle" 7 answers
Estamos viendo este error en una aplicación Winform. ¿Alguien puede ayudarme sobre por qué verá este error y, lo que es más importante, cómo solucionarlo o evitar que suceda?
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)
Agregué un cheque que lo hace funcionar ...
if (_form.Handle.ToInt32() > 0)
{
_form.Invoke(method, args);
}
siempre es cierto, pero la forma arroja un error sin él. Por cierto, mi manejo es de alrededor de 4.9 millones
Bueno, en mi caso, definitivamente los Objetos del USUARIO estaban fuera de control. Busqué en el Administrador de tareas de Windows y, efectivamente, el recuento de objetos del USUARIO estaba en 10''000 exactamente.
Incrustado dinámicamente propiedades y hojas de lista en Páginas de pestaña estableciendo la propiedad principal de la propiedad o el panel de contenedor de la hoja de lista en la página de pestaña. Estoy reciclando o recreando de forma condicional la propiedad y los formularios de hoja de lista dependiendo del tipo de colección que se enumera o el tipo de clase del objeto que se inspecciona.
NB: En Delphi, todos los controles tenían una propiedad Owner y Parent. Incluso si se cambiara la propiedad Parent de un control, su propietario lo eliminaría cuando se destruyera el control propietario.
En C # parece que si un control, por ejemplo, un Panel es reasignado programáticamente desde, digamos, un Formulario a una Página de Ficha cambiando la propiedad Panel.Parent, la invocación de Dispose () en el Formulario no eliminará el Panel, ni tampoco se invocarán Controles .Clear () en la página de pestañas. Incluso una llamada directa Panel.Dispose () en realidad no lo eliminará, a menos que su Parent se configure manualmente como nulo de antemano.
Creo que normalmente está relacionado con que la computadora se quede sin memoria por lo que no puede crear más identificadores de ventanas. Normalmente Windows también comienza a mostrar un comportamiento extraño en este punto.
Definitivamente demasiados controladores (problema de pérdida de memoria):
IT Jungles: System.ComponentModel.Win32Exception: error al crear el identificador de ventana
El límite del identificador de Windows para su aplicación es de 10,000 identificadores. Recibirá el error porque su programa está creando demasiados controladores. Necesitarás encontrar la pérdida de memoria. Como otros usuarios han sugerido, use un Profiler de memoria. Yo uso el .Net Memory Profiler también. Además, asegúrese de llamar al método de eliminación de los controles si los está eliminando de un formulario antes de que se cierre el formulario (de lo contrario, los controles no se eliminarán). También deberá asegurarse de que no haya eventos registrados con el control. Yo mismo tengo el mismo problema, y a pesar de lo que ya sé, todavía tengo algunas pérdidas de memoria que me siguen eludiendo ...
Este problema casi siempre está relacionado con el recuento de objetos GDI, el recuento de objetos de usuario o el recuento de identificadores y, por lo general, no debido a una condición de falta de memoria en su máquina.
Cuando estoy rastreando uno de estos errores, abro ProcessExplorer y miro estas columnas: Handles, Threads, Objetos GDI, Objetos de USER, Bytes privados, Tamaño virtual y Working Set.
(En mi experiencia, el problema suele ser una fuga de objeto debido a que un controlador de eventos mantiene el objeto y evita que se elimine).
La sugerencia de falta de memoria no parece una mala pista.
¿Qué está haciendo su programa que obtiene este error?
¿Está creando una gran cantidad de ventanas o controles? ¿Los crea programáticamente en lugar de en tiempo de diseño? Si es así, ¿haces esto en un bucle? Es ese bucle infinito? ¿Estás consumiendo cantidades asombrosas de memoria de alguna otra manera?
¿Qué sucede cuando observas la memoria utilizada por tu aplicación en el administrador de tareas? ¿Se dispara a la luna? O mejor aún, como se sugirió anteriormente, use el monitor de proceso para profundizar en los detalles.
Obtuve el mismo error en mi aplicación. Estoy cargando muchos controles en una sola página. En el botón, haga clic en evento, estoy limpiando los controles. Limpiar los controles no libera los controles de la memoria. Así que disponga los controles de la memoria. Acabo de comentar el método controls.clear () e incluí algunas líneas de código para eliminar los controles. Algo como esto
para cada ctl como control en controlcollection
ctl.dispose ()
Siguiente
Vea este post mío sobre "Error al crear el identificador de ventana" y cómo se relaciona con los objetos de usuario y el montón de escritorio. Proporciono algunas soluciones.