none
WPF Seite startet aus Windows Forms Anwendung extrem langsam RRS feed

  • 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

    Dienstag, 5. Mai 2015 06:02

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
    Sonntag, 10. Mai 2015 09:23

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

    Dienstag, 5. Mai 2015 07:25
    Moderator
  • 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

    Dienstag, 5. Mai 2015 07:45
  • 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

    Dienstag, 5. Mai 2015 08:17
    Moderator
  • 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

    Dienstag, 5. Mai 2015 16:03
  • Halo Thomas,

    Danke für die Info. Wie machst Du das mit einem PNG ?  ich kann nur ein BMP laden ? und das geht leider nicht so wie es soll. Bei der Show Anweisung bekomme ich immer eine Fehlermeldung.


    Gruß Roland

    Donnerstag, 7. Mai 2015 20:29
  • 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
    Freitag, 8. Mai 2015 04:22
  • 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

    Sonntag, 10. Mai 2015 08:10
  • 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
    Sonntag, 10. Mai 2015 09:23
  • Hallo Thomas,

    Danke. Das wird Aufwendiger als ich dachte.


    Gruß Roland

    Dienstag, 12. Mai 2015 07:27