2008-09-19 8 views
10

Ich arbeite an einer WPF-Anwendung, die manchmal seltsame Probleme aufweist und scheint in der Benutzeroberfläche hängen. Es ist inkonsistent, es passiert auf verschiedenen Seiten, aber es passiert oft genug, dass es ein großes Problem ist. Ich sollte erwähnen, dass es kein richtiger Fall ist, wie unten beschrieben.Wie behebt Sie Probleme mit WPF-Benutzeroberflächen?

Mein erster Gedanke war, dass die Animationen einiger Tasten das Problem darstellten, da sie auf den meisten Seiten verwendet werden, aber nach dem Entfernen von ihnen immer noch auftreten, obwohl scheinbar ein bisschen seltener. Ich habe versucht, in den Debugger einzubrechen, wenn der Hang auftritt; Es gibt jedoch nie einen Code zum Anzeigen. Es läuft kein Code von mir. Ich habe auch bemerkt, dass das "Hängen" nicht abgeschlossen ist. Ich habe Code, mit dem ich das Formular ziehen kann (es hat keine Grenze oder Titel), die weiterhin funktioniert. Ich habe auch meine gewonnene Schließen-Taste, die funktioniert, wenn ich darauf klicke. Das Klicken auf Schaltflächen scheint tatsächlich zu funktionieren, während mein Code ausgeführt wird, aber die Benutzeroberfläche wird einfach nie aktualisiert, um eine neue Seite anzuzeigen.

Ich suche nach Ratschlägen, Tools oder Techniken, um dieses seltsame Problem aufzuspüren, also, wenn Sie irgendwelche Gedanken überhaupt haben, werde ich es sehr zu schätzen wissen.

EDIT: Es ist gerade wieder passiert, also dieses Mal, als ich versuchte, in den Debugger einzubrechen wählte ich "Disassembly" zu zeigen. Es bringt mich zu MS.Win32.UnsafeNativeMethods.GetMessageW. Der Stack-Trace folgt:

[Managed to Native Transition] 

WindowsBase.dll MS.Win32.UnsafeNativeMethods.GetMessageW (ref System.Windows.Interop.MSG msg, System.Runtime.InteropServices.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x15 bytes
WindowsBase.dll! System.Windows.Threading.Dispatcher.GetMessage (Referenz 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. Schubrahmen (System.Windows.Threading.DispatcherFrame Rahmen) + 0x49 Bytes
WindowsBase.dll! System.Windows.Threading.Dispatcher.Run() + 0x4C Bytes
PresentationFramework.dll! System.Windows.Application.RunDispatcher (Objekt ignorieren) + 0x1e bytes
PresentationFramework.dll! System.Windows.Application.RunInternal (System.Windows.Window-Fenster) + 0x6f bytes PresentationFramework.dll! System.Windows.Application.Run (System.Windows.Window-Fenster) + 0x26 Bytes PresentationFramework.dll! System.Windows.Application.Run() + 0x19 Bytes WinterGreen.exe! WinterGreen.App.Main() + 0x5e Bytes C# [zu Managed Transition Nativ]
[Verwaltet Nativ e Transition]
mscorlib.dll! System.AppDomain.nExecuteAssembly (System.Reflection.Assembly assembly, string [] args) + 0x19 Byte 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 Activa, string [] activationCustomData) + 0x65 Bytes mscorlib .dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance (System.ActivationContext Activa) + 0xa Bytes mscorlib.dll! System.Activator.CreateInstance (System.ActivationContext Activa) + 0x3E
Microsoft.VisualStudio Bytes. HostingProcess.Utilities.dll! Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 Byte
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart_Context (Objektzustand) + 0x66 Bytes
mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext ExecutionContext, System.Threading.ContextCallback Rückruf, Objektzustand) + 0x6F Bytes
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart() + 0x44 Byte

Antwort

5

Versuchen Sie, das grenzenlose Verhalten Ihres Fensters zu entfernen und sehen Sie, ob das hilft. Sind BeginInvoke() oder Invoke() auch lang laufende Operationen?

Eine andere Sache zu betrachten: Wenn Sie in Ihren Code einbrechen, versuchen Sie, andere Threads als Ihren Hauptthread zu suchen. Einer von ihnen blockiert möglicherweise den UI-Thread.

+0

Es gibt Zeiten, wenn irgendein asynchroner Prozess ausgeführt wird; Dieses Verhalten kann jedoch jederzeit auftreten, auch direkt nach dem Start, wenn fast nichts ausgeführt wurde. Ich werde versuchen, das grenzenlose Verhalten zu entfernen. – palehorse

+0

Nur eine Anmerkung an andere Leute, die dies in der Zukunft lesen: Niemals lang andauernde Operationen auf Ihrem Dispatcher aufrufen() oder BeginInvoke(). Ihre Benutzeroberfläche scheint zu hängen ... Verwenden Sie einen Thread oder BackgroundWorker oder etwas ähnliches. –

+0

Bob hat recht, wenn Sie zu viel auf dem UI-Thread tun, reagiert die Benutzeroberfläche nicht mehr. Sie möchten so wenig wie möglich im UI-Thread ausführen. Alle großen Operationen sollten in einem Hintergrundthread ausgeführt werden. –

4

Ein großes Werkzeug ist Snoop. Wirklich gut, um zu sehen, welche WPF-Objekte zu einem bestimmten Zeitpunkt im visuellen Baum angezeigt werden. Ich bin mir nicht sicher, wie viel es helfen wird, aber es ist möglich, dass du den UI-Thread mit einer Menge zusätzlicher Dinge jammst, die es zu tun hat. Snoop kann Ihnen vielleicht dabei helfen, auf dem Bildschirm zu finden, was Sie suchen.

+0

Snoop wird wahrscheinlich nicht helfen, da der Code hängt, aber der Fragesteller kann nicht in den Hang brechen. –

+0

Ich habe Snoop versucht, aber wie Bob bemerkt, hilft es nicht. Ich habe eine andere Sache bemerkt, die ich bearbeiten werde, um die ursprüngliche Frage einzuschließen. – palehorse

6

Ihre WPF-App könnte aufgrund von Leistungsproblemen hängen. Versuchen Sie es mit Perforator, um zu sehen, ob Sie Teile haben, die Software gerendert werden oder wenn Ihre App zu viel Video-RAM verwendet.

+0

Ich wusste nicht über dieses Tool. Ich werde es in Kürze installieren, – palehorse

+0

+1 für die Perforator Erwähnung. 1 weiteres Werkzeug in der Tasche! – Stimul8d

4

Ich habe das grenzenlose Verhalten entfernt, wie von Bob King vorgeschlagen. Bis heute scheint das Problem gelöst zu sein.

Jetzt ist die Frage, warum und wie kann ich das Problem beheben? Das Produkt ist so konzipiert, dass es keine Ränder mit abgerundeten Ecken und transparenten Teilen aufweist.

+0

Ich brauche das auch. Ich hatte gerade genau das gleiche Problem. Ich bemerkte einen MASSIVEN Leistungszuwachs, als ich zu einer Fensterapplikation auch wechselte. – Stimul8d

1

Hurra, ... es scheint, dass das Problem nicht mit randlosen Fenstern verwandt ist (zumindest in meinem Fall).

Es gibt einen großen Leistungseinbruch, wenn Sie AllowsTransparency auf true setzen. So ein großer Hit scheint es zu sein, dass die ganze Sache den UI-Thread hängen kann. Sehr seltsames Verhalten. Konnte mit this ticket in Verbindung stehen

Verwandte Themen