2008-09-19 8 views
10

Estoy trabajando en una aplicación WPF que a veces muestra problemas extraños y parece que cuelga en la interfaz de usuario. Es inconsistente, sucede en diferentes páginas, pero sucede con frecuencia que es un gran problema. Debo mencionar que no es un verdadero problema como se describe a continuación.¿Cómo se solucionan los problemas de la interfaz de usuario de WPF?

Lo primero que pensé fue que las animaciones de algunos botones eran el problema, ya que se usan en la mayoría de las páginas, pero después de eliminarlas aún se producen bloqueos, aunque aparentemente un poco menos a menudo. Intenté entrar en el depurador cuando se produce el bloqueo; sin embargo, nunca hay ningún código para ver. No hay código mío en ejecución. También noté que el "bloqueo" no está completo. Tengo un código que me permite arrastrar el formulario (no tiene borde ni título) que continúa funcionando. También tengo mi botón de cierre ganado que funciona cuando hago clic en él. Al hacer clic en los botones, parece que realmente funciona mientras se ejecuta mi código, pero la interfaz de usuario simplemente nunca se actualiza para mostrar una nueva página.

Estoy buscando algún consejo, herramientas o técnicas para rastrear este extraño problema, por lo que, si tiene alguna idea, la agradeceré enormemente.

EDIT: Simplemente sucedió de nuevo, así que esta vez cuando traté de entrar en el depurador elegí "mostrar el desmontaje". Me lleva a MS.Win32.UnsafeNativeMethods.GetMessageW. El seguimiento de la pila siguiente:

[Managed to Native Transition] 

WindowsBase.dll MS.Win32.UnsafeNativeMethods.GetMessageW (ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef CVent, int uMsgFilterMin, int uMsgFilterMax) + 0x15 bytes
WindowsBase.dll! System.Windows.Threading.Dispatcher.GetMessage (ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 bytes WindowsBase.dll! System .Windows.Threading.Dispatcher.PushFrameImpl (System.Windows.Threading.DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame}) + 0x8b bytes WindowsBase.dll! System.Windows.Threading.Dispatcher. PushFrame (marco System.Windows.Threading.DispatcherFrame) + 0x49 bytes
WindowsBase.dll! System.Windows.Threading.Dispatcher.Run() + 0x4C bytes
PresentationFramework.dll! System.Windows.Application.RunDispatcher (objeto ignorar) + 0x1e bytes
PresentationFramework.dll! System.Windows.Application.RunInternal (ventana System.Windows.Window) + 0x6f bytes PresentationFramework.dll! System.Windows.Application.Run (ventana System.Windows.Window) + 0x26 bytes PresentationFramework.dll! System.Windows.Application.Run() + 0x19 bytes WinterGreen.exe! WinterGreen.App.Main() + 0x5E bytes C# [Originario de transición controlada]
[Gestionado a Nativ e Transición]
mscorlib.dll! System.AppDomain.nExecuteAssembly (System.Reflection.Assembly assembly, string [] args) + 0x19 bytes mscorlib.dll! System.Runtime.Hosting.ManifestRunner.Run (bool checkAptModel) + 0x6e bytes mscorlib.dll! System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 bytes mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext ActivationContext, string [] activationCustomData) + 0x65 bytes mscorlib .dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext activationContext) + 0xa bytes mscorlib.dll! System.Activator.CreateInstance (System.ActivationContext activationContext) + 0x3e bytes
Microsoft.VisualStudio. HostingProcess.Utilities.dll! Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 bytes
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart_Context (estado de objeto) + 0x66 bytes
mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback de devolución de llamada, el estado del objeto) + 0x6F bytes
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes

Respuesta

5

Intente eliminar el comportamiento sin bordes de su ventana y vea si eso ayuda. Además, ¿está BeginInvoke() 'ing o Invoke()' en cualquier operación de larga ejecución?

Otra cosa a tener en cuenta: cuando ingrese su código, intente buscar hilos que no sean su hilo principal. Uno de ellos puede estar bloqueando el hilo de UI.

+0

Hay ocasiones en que se ejecuta algún proceso asincrónico; sin embargo, este comportamiento puede ocurrir en cualquier momento, incluido justo después del inicio cuando casi no se ha ejecutado nada. Intentaré eliminar el comportamiento sin bordes. – palehorse

+0

Solo una nota para otras personas que lean esto en el futuro: operaciones de larga ejecución de Never Invoke() o BeginInvoke() en su despachador. Su interfaz de usuario parecerá colgarse ... use un hilo o BackgroundWorker o algo similar. –

+0

Bob tiene razón, si está haciendo demasiado en el hilo de la interfaz de usuario a la vez, la interfaz de usuario dejará de responder. Desea hacer lo menos posible en el hilo de UI; cualquier operación grande debería hacerse en un hilo de fondo. –

4

Una gran herramienta es Snoop. Realmente agradable para ver qué objetos de WPF se muestran en el árbol visual en un momento dado. No estoy seguro de cuánto ayudará, pero es posible que estés bloqueando el hilo de UI con muchas cosas adicionales que tiene que hacer. Snoop puede ayudarte a rastrear lo que está en la pantalla para darte una idea de qué buscar.

+0

Probablemente Snoop no lo ayude ya que el código se cuelga, pero el interlocutor no puede romperse. –

+0

He intentado fisgonear, pero como notó Bob, no ayuda. Me he dado cuenta de otra cosa que voy a editar la pregunta original para incluir. – palehorse

6

Su aplicación WPF podría suspenderse debido a problemas de rendimiento. Intente usar Perforator para ver si tiene partes que son software renderizadas o si su aplicación está usando demasiados archivos RAM de video.

+0

No sabía sobre esa herramienta. Lo instalaré en breve, – palehorse

+0

+1 para la mención del perforador. 1 herramienta más en la bolsa! – Stimul8d

4

He eliminado el comportamiento sin bordes según lo sugerido por Bob King. Hasta la fecha, eso parece haber eliminado el problema.

Ahora la pregunta es, ¿por qué y cómo puedo solucionar el problema? El producto está diseñado para no tener borde con algunas esquinas redondeadas y partes transparentes.

+0

Necesito esto también. Acabo de tener exactamente el mismo problema. Observé una ganancia de rendimiento MASSIVE cuando también cambié a una aplicación con ventana. – Stimul8d

1

Hurra, ... parece que el problema no está relacionado con las ventanas sin bordes (al menos en mi caso).

Hay un gran golpe de rendimiento cuando establece AllowsTransparency en verdadero. Parece tan impactante que todo puede colgar el hilo de UI. Comportamiento muy extraño. Podría estar relacionado con this ticket

Cuestiones relacionadas