Da ich für ein Projekt immer wieder Zugriff auf diverse Leistungsindikatoren brauchte, überlegte ich mir eine kleine Helfer-Anwendung zu schreiben. Wenn schon eine neue Anwendung warum nicht gleich mit WPF, so als kleine Übung. Das klappte auch recht gut. Nur fiel mir beim Ausführen der Anwendung in C# Express eine sehr lange Startphase auf. Also einen Release-Build erstellt die Anwendung direkt gestartet; mit dem gleichen Ergebnis. Zurück im Debugger, und einige Stopwatch-Auswertungen später, war klar dass das laden der Leistungsindikatoren in eine ObservableCollection<T> doch sehr lange dauerte. Der unschöne Effekt dabei war, dass die Anwendung erst auf dem Desktop sichtbar wurde, nachdem alle benötigten Objekte geladen waren. Jetzt stelle ich mir einen Benutzer vor der auf die Verknüpfung der Anwendung klickt und nach 5 Sekunden ist immer noch nichts passiert. Wie das endet kann sich jeder selbst ausmalen. In diversen Foren konnte ich nachlesen dass dieses Verhalten bekannt ist. Meist wird empfohlen einen Startbildschirm während des Ladens anzuzeigen. Die Recherche zu dem Thema förderte die verschiedensten Möglichkeiten zu Tage. Meistens wurde zum laden einer Grafik mittels PInvoke geraten. Das mag zwar eine sehr schnelle Lösung im Startverhalten sein, aber nicht dass was ich wollte. Nach dem Durchforsten von vielen weiteren Lösungsansätzen bin ich auf diese Diskussion im MSDN-Forum gestoßen. Der Beitrag von TomGiam gefiel mir auf Anhieb. Vor allem bleibt bei seiner Lösung das Initialisieren des Splash Screen, die Interaktion mit diesem währen des Ladens der zeitintensiven Objekte, sowie das Laden der Hauptanwendung an einem Platz; in der App-Klasse. Die gesamte Interaktion, sowohl mit der SplashScreen- als auch mit der Window1-Klasse, wird sauber und Cross-Thread safe mittels Delegaten gehandhabt.
Auf diesem Konzept aufbauend habe ich die Lösung in meiner Anwendung realisiert und war erstaunt wie schnell der Splash Screen geladen wurde. Obwohl komplett auf WPF basierend. Im einzelnen ein WPF-Fenster mit ProgressBar und einem TextBlock zur Ausgabe der Statusmeldungen sowie einem Button um die Anwendung währen des Ladens abbrechen zu können.
Da der gesamte Ladevorgang in einer Methode in der App-Klasse abläuft, kann der Fortschritt sowie evtl. Statusmeldungen jederzeit auf dem Splash Screen ausgegeben werden. Wenn alle benötigten Objekte geladen wurden, können diese einfach an eine Überladung des Kontruktors der Window1-Klasse übergeben werden.
Mir gefiel diese Lösung so gut, dass ich mir eine Projektvorlage daraus erstellt habe. Für interessierte habe ich einmal das Konzept als C# Projekt angehängt sowie eine fertige Projektvorlage als MSI Installer. Den Installer habe ich für den Template-Pfad unter C# Express erstellt. Ob diese Pfad auch in Visual Studio stimmt, weiß ich nicht.
Über Rückmeldungen und Kritiken, in jeder Form, würde ich mich freuen.
Downloads:
WPF Splash Screen Projekt herunterladen
WPF Splash Screen Template herunterladen
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitte "kicken" sie ihn.
