У меня возникли трудности с отображением прогресса сборок, загружаемых в AppDomain.CurrentDomain.Как сообщить о ходе загрузки сборок в Current AppDomain в .Net на заставке?
Что я хочу сделать, это отобразить заставку с индикатором выполнения, я хочу обновить этот индикатор выполнения, поскольку каждая сборка загружается в память в AppDomain. Таким образом, у пользователей будет визуальный индикатор прогресса запуска приложения.
Мне все равно, что сборки загружаются до отображения экрана Splash, который фактически является стандартным WPF-окном с индикатором выполнения. Когда загружен экран Splash, я хотел бы сообщить сборки, когда они загружены. Я не загружаю эти сборки вручную.
До сих пор я обработал событие запуска в App.xaml со следующей разметке:
Startup="Application_Startup"
Соответствующий код позади для запуска выглядит следующим образом:
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));
}
Это работает, как я ожидал он отображает экран всплеска и любые сборки, которые загружаются в момент отображения заставки, отображаются на экране без проблем.
Проблема здесь в том, что я не могу видеть способ отчетности о ходе собраний загружается.
Ассембли не кажутся загруженными линейно в любом конкретном порядке, из-за этого я не уверен, как это сделать, чтобы подсчитать оставшееся количество сборок для загрузки. Я не вижу очевидного способа, чтобы получил какие сборки в настоящее время загружается.
Если бы я мог получить список сборок еще не загружены в CLR я мог бы реализовать прогресс бар с помощью либо стандартный подсчет, вдоль линий
progress = numberOfLoadedAssemblies/totalNumberOfAssemblies * 100;
Или путем реализации логики от Chris Marisic's excellent answer on using a weighted average
Я не могу сделать тривиальный «Directory.GetFiles(). Длина« Чтобы получить общее количество сборок для загрузки. Причина в том, что CLR не загружает сборки в каком-либо конкретном порядке. Кажется, что загружает некоторые сборки из корня приложения, затем некоторые из GAC, а затем больше из корня приложения.
Что бы я хотел знать, если есть способ получить список оставшихся сборок для загрузки.
Это предполагает, что вы точно знаете, сколько времени потребуется. Конечно, нет. Вы могли бы в лучшем случае подсчитать сборки, но, тем не менее, маловероятно, чтобы они были репрезентативными, так как загрузка сборок слепо быстро. Это джиттинг и запуск кода в сборках, требующих времени. Храните то, что у вас есть. –
Можете ли вы подсчитать количество раз, когда вызываются «CurrentDomain_AssemblyLoad» и обновляется ли индикатор выполнения? – Trisped
@Trisped Хорошая вероятность того, что количество сборок может измениться, поскольку я добавляю дополнительные функции в свой проект. Спасибо за ваши и комментарии Ханса. –