Benutzer mit den meisten Antworten
WPF Seite startet aus Windows Forms Anwendung extrem langsam

Frage
-
Hallo Forum,
ich habe eine Anwendung in Windows Forms (Projekt1) aus der ich jetzt die WPF Seiten (Projekt2) starte.
Wenn die WPF Seiten das erste Mal gestartet wird, dauert das eine gefühlte Ewigkeit. Woran liegt das ?
Was kann ich tun um die Zeit zu verkürzen ?
Gruß Roland
Antworten
-
Der SplashScreen wird angezeigt, wenn die WPF-Applikation (.exe) gestartet wird.
Wenn du diese zur Laufzeit anzeigst, und nicht als eigenständige Applikation lädst (wie ich das verstanden habe...), dann musst du für WinForms einen eigenen SplashScreen erstellen.
DAs wäre dann auch etwas aufwändiger.
Dazu würde ich dir folgende Links zum durchlesen vorschlagen:
© 2015 Thomas Roskop
Germany // Deutschland
- Als Antwort markiert Roland DE Dienstag, 12. Mai 2015 07:26
Alle Antworten
-
Hallo,
WinForms und WPF sind sehr verschiedene Technologien. Beim Starten einer Anwendung werden nun alle benötigten DLLs geladen, in deinem Fall aber erstmal nur die von WinForms. Wenn du nun eine WPF Komponente aufrufst, werden alle dafür benötigten DLLs nachgeladen. Leider sind das sehr viele, weswegen das Anfangs etwas dauert.
Die Zeit wird irgendwann wärend der Lebenszeit des Programms benötigt. Entweder zum Programmstart oder kurz bevor die Komponenten benötigt werden. Meistens ist letzteres effizienter, da der Benutzer nicht schon am Anfang warten muss, sondern erstmal arbeiten kann.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo Tom,
Danke für die Info.
Sowas in der Richtung habe ich mir schon gedacht, war mir aber nicht sicher woran es wirklich liegt.
Bei den WinForms benutze ich auch immer beim Schließen this.dispose() was es bei WPF ja nicht gibt. Ist das nicht mehr nötig ?
Gibt es die Möglichkeit die DLLs irgendwie im Hintergrund parallel beim Prg start zu laden ?
Gruß Roland
-
Hallo Roland,
das manuelle Aufrufen von Dispose ist mMn für Forms nicht nötig. Es wird automatisch beim schließen des Fensters erledigt. In WPF ist es nicht mal implementiert, weil keine unmanaged Ressourcen direkt dahinter liegen, die frei gegeben werden müssen.
Ob man das Laden asynchron gestalten kann, kann ich dir nicht zu 100%iger Sicherheit sagen, ich glaube es jedoch nicht. Ich würde wahrscheinlich das anzeigen in einen 2. Thread auslagern und dann eine Ladeanimation anzeigen...
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Wie Tom bereits geschrieben hat, muss für WPF zu der Laufzeit ein wahrer Rattenschwanz an weiteren DLL-Komponenten nachgeladen werden.
Wenn es so ist - ich bin mir nicht sicher - dass die DLLs erst dann geladen werden, wenn die innenliengenden Klassen benötigt werden, dann solltest du die DLLs vielleicht besser am Anfang dynamisch laden.
Das manuelle laden der DLLS kannst du mittels Assembly.Load(string filename) hinbekommen.
Du könntest doch entweder a) den Rattenschwanz asynchron (Hintergrundthread) laden, wärend der Benutzer was anderes macht oder am Anfang alles laden und dafür einen Splashscreen anzeigen (Ein SplashScreen ist das, was z.B. word beim starten anzeigt. Du kannst einfach ein PNG-Bild in die Projektmappe einfügen und dann die Eigenschaften öffnen und dort den Typ "Splashscreen" auswählen. Der Rest läuft automatisch.)
© 2015 Thomas Roskop
Germany // Deutschland
-
Hallo Roland,
hier findest du eine kleine Anleitung wie das korrekt geht: How to: Add a Splash Screen to a WPF Application
Du kanst verschiedene Datentypen (BMP, JPG, PNG...) verwenden, solltest du auch darauf achten, dass die Bilddatei gültig ist. Kann die Datei geöffnet werden mit den Standartprogrammen?
Bei welcher Show()-Anweisung hast du Probleme? Wird der SplashScreen, das WinForms oder daas WPF-Fenstr nicht angezeigt?
© 2015 Thomas Roskop
Germany // Deutschland
- Bearbeitet Thomas Roskop Freitag, 8. Mai 2015 04:23 +Erweiterung
-
Hallo Thomas,
Danke für die Info.
Wenn ich das Fenster aus dem WPF Projekt aufrufe, dann kommt der Splash Screen. Nur ich starte das Programm ja über die WinForms und dann das WPF aus dem anderen Projekt und da kommt der Splash Screen nicht.
Kommt der nur wenn man mit dem WPF Hauptfenster startet ? ich lade natürlich ein bestimmtes WPF Fenster. Starte also nicht wie gewohnt mit dem Main Fenster.
Splash Screen unter WinForm geht gar nicht. Wenn ich das einbinde werden alle Windows Message Befehle "angemekert".
Gruß Roland
-
Der SplashScreen wird angezeigt, wenn die WPF-Applikation (.exe) gestartet wird.
Wenn du diese zur Laufzeit anzeigst, und nicht als eigenständige Applikation lädst (wie ich das verstanden habe...), dann musst du für WinForms einen eigenen SplashScreen erstellen.
DAs wäre dann auch etwas aufwändiger.
Dazu würde ich dir folgende Links zum durchlesen vorschlagen:
© 2015 Thomas Roskop
Germany // Deutschland
- Als Antwort markiert Roland DE Dienstag, 12. Mai 2015 07:26