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
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
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. –
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. –