Ich habe eine kleine Schwierigkeit beim Anzeigen des Fortschritts von Assemblys, die in die AppDomain.CurrentDomain geladen werden.Wie kann ich den Fortschritt beim Laden von Assemblys in die aktuelle Anwendungsdomäne in .Net auf einem Startbildschirm melden?
Ich möchte einen Begrüßungsbildschirm mit einer Fortschrittsleiste anzeigen. Ich möchte diese Fortschrittsleiste aktualisieren können, wenn jede Assembly in den Speicher der AppDomain geladen wird. Auf diese Weise erhalten Benutzer einen visuellen Hinweis auf den Fortschritt des Anwendungsstarts.
Es ist mir egal, dass Assemblys geladen werden, bevor der Startbildschirm gerendert wird, der eigentlich nur ein Standard-WPF-Fenster mit einer Fortschrittsleiste ist. Sobald ein Begrüßungsbildschirm geladen ist, möchte ich die Assemblies beim Laden melden. Ich lade diese Baugruppen nicht manuell.
Bisher habe ich das Startup-Ereignis in App.xaml mit folgendem Markup behandelt:
Startup="Application_Startup"
Der entsprechende Code-behind für die Inbetriebnahme ist wie folgt:
private void Application_Startup(object sender, StartupEventArgs e)
{
SplashScreen.Show<SplashScreen>();
AppDomain.CurrentDomain.AssemblyLoad += CurrentDomain_AssemblyLoad;
}
void CurrentDomain_AssemblyLoad(object sender, AssemblyLoadEventArgs args)
{
SplashScreen.CallSplashScreenMethod<SplashScreen>(x => x.Text(args.LoadedAssembly.GetName().Name));
}
Dies funktioniert wie ich erwarte, Es wird ein Begrüßungsbildschirm angezeigt und alle Baugruppen, die zum Zeitpunkt der Anzeige des Begrüßungsbildschirms geladen werden, werden problemlos auf dem Bildschirm angezeigt.
Das Problem hier ist, dass ich nicht eine Art und Weise der Berichterstattung Fortschritte von Baugruppen wird geladen sehen.
Baugruppen scheinen nicht linear in einer bestimmten Reihenfolge geladen zu sein. Aus diesem Grund bin ich nicht sicher, wie die Anzahl der verbleibenden Baugruppen berechnet werden soll. Ich kann keinen offensichtlichen Weg zu sehen, welche Baugruppen gerade geladen werden.
Wenn ich könnte eine Liste von Baugruppen erhalten noch von der CLR geladen werden ich entweder durch Verwendung einer Standardzahl, entlang der Linien
progress = numberOfLoadedAssemblies/totalNumberOfAssemblies * 100;
Oder durch die Implementierung der Logik von Chris Marisic's excellent answer on using a weighted average einen Fortschrittsbalken implementieren könnte
Ich kann keine triviale "Directory.GetFiles(). Länge" Um die Gesamtzahl der Baugruppen geladen werden. Der Grund dafür ist, dass die CLR Baugruppen nicht in einer bestimmten Reihenfolge lädt. Es scheint einige Assemblys aus dem Anwendungsstamm zu laden, dann einige aus dem GAC, dann mehr aus dem Anwendungsstamm.
Was ich gerne wissen würde, ist, wenn es eine Möglichkeit gibt, eine Liste von verbleibenden Baugruppen geladen werden.
Dies würde davon ausgehen, dass Sie genau wissen, wie lange es dauern wird. Natürlich nicht. Man könnte höchstens Assemblys zählen, das ist aber sehr unwahrscheinlich repräsentativ, da das Laden von Baugruppen blind ist. Es ist Jitting und Code in den Assemblys auszuführen, der Zeit braucht. Behalte, was du hast. –
Können Sie einfach die Anzahl der Aufrufe von CurrentDomain_AssemblyLoad zählen und den Fortschrittsbalken darauf basierend aktualisieren? – Trisped
@Trisped Es besteht eine gute Chance, dass sich die Anzahl der Assemblies ändert, wenn ich meinem Projekt zusätzliche Funktionen hinzufüge. Danke für deine und Hans Kommentare bis jetzt. –