60 KLOC の Windows VB.NET アプリケーションを VS 2012 および Windows 8 にアップグレードしました。昨日 ClickOnce にデプロイしたときを除いて、すべて問題ないように見えました。
フォームがバインドを使用している場合、ClickOnce アプリケーションは、フォームが最初に起動されたときにすべてのフォームを読み込むのが非常に遅くなります。フォームがバインドを使用していない場合 (ただし、DB クエリからデータを選択している場合) は、通常どおりロードされます。
最も面白い部分は、VS2012 でのデバッグ中に 1 秒未満でロードされることです。ClickOnce バージョンから起動すると、読み込みに 60 秒以上かかります。
ClickOnce アプリケーションでこれらのフォームの 1 つを閉じて再度開くと、通常は 1 秒未満で読み込まれます。
VS2012 でのバインドは、フォームが初めて読み込まれたときに非常に悪いようですが、私は何か間違ったことをしていると思います。
この問題についてのアイデアはありますか?
編集 2013/01/18:
不要なコードを 1 日削減した後、低速を再現し、不要なコードがないソリューションにたどり着きました。これにより、適切に機能していないものを見つけやすくなります (希望)。
ClickOnce アプリケーションは次のとおりです。
http://www.octet.it/Reproduce/
ソースファイルは次のとおりです。
http://www.octet.it/Reproduce/Reproduce.zip
遅さは次のものに依存していないと言えます。
- SQL Server (SQL サーバー DB にアクセスしていたすべてのコードをカットしました)。
- バインディング(現在、バインディングはまったくありません)。
- 開発環境: VS2012 からアプリケーションを実行すると、期待どおりに動作します。
遅さを再現するための指示:
- ClickOnce アプリケーションを Windows 8 マシンにインストールします (私のマシンは x64 で、テストする x86 はありませんでした)。
- タスクマネージャーを起動します。
- 「再生」アプリケーションを起動します。
- MDI フォームが読み込まれたら、[Return] キーを押します (これにより、MDIChild フォームが起動されます)。
- タスク マネージャーを見て、「再現」アプリがマシンの CPU の 1 つを飽和状態にし、約 650 MB の RAM を占有する様子を確認してください。
- 約 45 ~ 60 秒後、MDIChild フォームが表示されます。
- MDIChild フォームを閉じます。
- [Return] をもう一度押すと、MDIChild がほぼ瞬時に表示され、タスク マネージャーに CPU の飽和や RAM の増加が表示されないことがわかります。
私が言ったように、Win 8 より前の MDIChild (さまざまなテーブルへのバインディングと SQL アクセスを含む) は約 2 ~ 3 秒で表示されました。
ソース ファイルはあまり興味深いものではありません。MDIChild フォームを呼び出す MDIparent フォームが表示されるだけですが、実験を行いたい場合は、それらを .ZIP ファイルに含めました。
お時間をいただきありがとうございます。
この問題を解決するために何ができるか教えてください。どんな提案でも大歓迎です。