スプラッシュ画面で.Netの現在のAppDomainへのアセンブリのロードの進行状況を報告するにはどうすればよいですか?

ダニエルレーン

AppDomain.CurrentDomainにロードされているアセンブリの進行状況を表示するのに少し問題があります。

私がやりたいのは、プログレスバーのあるスプラッシュ画面を表示することです。各アセンブリがAppDomainのメモリに読み込まれるときに、このプログレスバーを更新できるようにします。このようにして、ユーザーはアプリケーションの起動の進行状況を視覚的に示すことができます。

スプラッシュ画面がレンダリングされる前にアセンブリが読み込まれることは気にしません。これは実際には、進行状況バーのある標準のWPFウィンドウです。スプラッシュ画面がロードされたら、ロードされたアセンブリを報告したいと思います。これらのアセンブリを手動でロードしていません。

これまで、App.xamlのStartupイベントを次のマークアップで処理してきました。

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;

または、加重平均の使用に関するChrisMarisicの優れた回答からのロジックを実装することによって

ロードするアセンブリの総数を取得するための簡単な「Directory.GetFiles()。Length」を実行できませんその理由は、CLRが特定の順序でアセンブリをロードしていないためです。一部のアセンブリはアプリケーションルートからロードされ、次にGACからロードされ、さらにアプリケーションルートからロードされるようです。

私が知りたいのは、ロードする残りのアセンブリのリストを取得する方法があるかどうかです

クリス・マリシック

他の人が述べているように、ロードされた10個のうち9個のアセンブリが90%を意味すると仮定することはできません。ただし、これらの仮定をより現実的にすることができます。

ロードされるすべてのアセンブリのファイル情報をスキャンして、各アセンブリのファイルサイズを取得します。次に、「平均」アセンブリの加重値を作成します。

var totalSize =  assemblies.Select(x=> x.FileSize).Sum();
var averageSize = totalSize / assemblies.Count();

var averageChange = averageSize / totalSize;

プログレスバーが0から1のスケールであると仮定すると、averageChange別のアセンブリがロードされるたびに追加することができます

または、実際にロードされたバイト数とプログレスバーの合計サイズを数えることもできます。私は個人的に、1つのアセンブリからプログレスバーが[-]から[-------------------]になるのを防ぐために、平均化された方法を使用します。ユーザーは非線形の変更に慣れておらず、非線形の変更を信頼する傾向がありません。ロードが完了するとほぼ正確に終了する直線的に増加するプログレスバーを提供することで、人々は物事が機能しているという適切な感覚を得ることができ、まもなく完了します。プログレスバーの不規則なジャンプは、ユーザーシステムが不規則で信頼できないと感じさせます。

私が過小評価できないことの1つは、プログレスバーでユーザーを怒らせることがいかに簡単かということです。ヒット99%を急速に埋めて停止するプログレスバーほど、ユーザーを怒らせるものはありません。プログラムがフリーズしたような気分にさせてくれます。また、メーターで物事が凍結していないことを視覚的に示す必要があります。また、長時間座ったくない場合(これは数秒です)、進行状況バーがいっぱいになってからゼロに戻ります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ